无法使用实体框架代码优先的凭据创建数据库吗?

问题描述 投票:0回答:1

我对代码优先方法有些陌生,但是在使用实体框架之前我先使用数据库优先方法,现在我想先使用代码,这是一种习惯。

我开始创建模型,并且一切都很好,然后也启用了迁移和添加迁移,并且都运行良好,但是当我运行Update-Database命令时出现错误。

因此,我想先使用凭据创建代码优先的数据库,经过大量研究后,我没有找到解决方案,并且大多数教程使用“受信任的连接”。

我用什么

App.Config

  <connectionStrings>
    <add name="CodeFirst" connectionString="Server=.\SQLEXPRESS;Database=CodeFirst;User ID=anyuser;Password=anypassword;"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

DbContext类

public class CodeFirstContext : DbContext
    {
        public CodeFirstContext() : base("name=CodeFirst")
        {

        }

        public DbSet<Product> Products { get; set; }

        public DbSet<Category> Categories { get; set; }

    }

我得到的错误

Login failed for user 'anyuser'.

问题是我做错了什么?或使用代码优先方法无法使用凭据?

提前感谢

c# entity-framework ef-code-first ef-migrations code-first
1个回答
0
投票

OP:

我想使用凭据和<>使用代码优先与[[创建数据库

...和:

经过大量研究,我没有找到解决方案,并且大多数教程使用“受信任的连接”。

[使用特定登录名部署到新数据库时,

代码优先方法存在问题

-这是鸡肉和鸡蛋,因为:
    该数据库尚不存在
  1. 连接字符串正在请求显式登录
  2. 该登录名在说SQL中尚不存在
  3. 因为数据库不存在
  4. OP的配置:

<connectionStrings> <add name="CodeFirst" connectionString="Server=.\SQLEXPRESS;Database=CodeFirst;User ID=anyuser;Password=anypassword;" ... /> </connectionStrings>

那是什么解决方案?

  1. 使用集成安全性:

    这使您可以从代码从头开始创建数据库。但是,您以后可能需要创建任何其他登录信息。但是,这是一个不好的做法,因为您应该习惯于拥有一个用于部署的帐户和另一个用于常规应用访问的帐户]
  2. 首先创建登录名:

  3. 这使您可以使用指定的登录名,但是最可能需要先从SQL创建数据库框架,然后才能创建登录名。代码优先的纯粹主义者可能不喜欢这个想法。
后者确实遵循您从数据库时代起就应该已经熟悉的DACPAC最佳实践。就像DACPAC不应该如何部署登录名和调整安全性一样,代码优先也不应该。归根结底,数据库并不关心您使用代码优先还是数据库优先,但是数据库管理员可能会因使用的安全性而惹恼他人。

为什么采用数据库优先方法会更好?

代码优先尝试通过代码来完成所有事情,而崇高的追求也许是不现实的。如上所述,可能无法进行尝试创建登录之类的操作。

同时,通过从数据库侧部署DACPAC来进行数据库优先模式更改。身份验证首先是通过用于登录SSMS的登录名进行的。 DACPAC部署不需要.NET或其他代码。

DACPAC可以创建和/或修改数据库安全性,包括登录名,但通常对此并不满意。

[更多的考虑因素,代码优先和EF迁移在现实环境中失败了,因为Visual Studio(创建迁移的事物)仅了解直接目标数据库架构(无论开发人员使用的是什么),并且不是:

    您在共享的[[DEV阶段环境中可能具有不同的数据库模式
  • [中稍微不同的数据库模式>[[UAT中很有可能是完全合理的不同数据库模式)>
  • PROD
  • 的巨大差异>
  • [我看到这么多开发人员仅首先在其本地机器上纯粹使用代码,然后再使用“其他方式”将数据库架构更改部署到其他阶段。
  • © www.soinside.com 2019 - 2024. All rights reserved.