无法使用 Entity Framework Code-First 使用凭据创建数据库?

Cannot Create Database with credentials using Entity Framework Code-First?

我对代码优先方法有点陌生,但在使用 entity framework 之前我使用了数据库优先方法,现在我想改为使用代码优先,这是一种习惯。

我开始创建模型,一切都很好,然后也启用了迁移和添加迁移,一切正常,但是当我 运行 更新数据库命令时,我收到一个错误。

因此我想使用凭据创建一个代码优先的数据库,经过大量研究后我没有找到解决方案,大多数教程使用 "Trusted Connection"。

我用什么

App.Config

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

DbContext Class

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'.

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

提前致谢

OP:

I want to create a database with code-first using credentials,

...和:

after a lot of research I didn't find a solution and mostly tutorials use "Trusted Connection".

这就是使用特定登录 部署到新数据库时 代码优先方法的问题 - 这是一个 鸡和鸡蛋 因为:

  1. 数据库还不存在
  2. 连接字符串正在请求显式登录
  3. 登录还不存在于SQL
  4. 因为数据库不存在

OP 的配置:

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

那么解决方案是什么?

  1. 使用集成安全: 这允许您从头开始从代码创建数据库。但是,您可能需要的任何其他登录名可能需要稍后创建。但是,就数据库而言,这是一种不好的做法,因为您应该养成使用一个帐户进行部署(具有足够的部署权限)和另一个用于一般应用程序访问权限(没有部署权限)的习惯

  2. 首先创建登录名:这允许您使用指定的登录名,但是您很可能需要创建一个空白 数据库首先来自 SQL,然后才能创建登录名。代码优先的纯粹主义者可能不喜欢这个想法。

后者确实遵循 DACPAC 最佳实践,您在使用数据库优先时应该已经熟悉了。就像 DACPAC 不应该部署登录和调整安全性一样,代码优先也不应该。毕竟在一天结束时,数据库不关心你是使用代码优先还是数据库优先(在幕后,两者都可能使用某种形式的封装脚本)但是你的数据库管理员可能会根据安全性的不同而引起注意正在使用中。

数据库优先的方法更好吗?

don't do that, try this instead 的主题中,代码优先尝试通过代码来做所有事情,而崇高的追求也许是不现实的。如上所述,尝试创建登录等某些事情可能是不可能的。

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

DACPAC 可以创建 and/modify 包括登录在内的数据库安全性,但通常不受欢迎。

您可能需要重新考虑代码优先。在现实世界中,代码优先和 EF 迁移作为一个概念并没有真正成功,在现实世界中,您已经上演了 DEV 等 CD 环境;测试; UAT 和产品。

我看到很多开发人员只使用 code-first 来部署到他们的 本地数据库 。到达那里后,他们使用不同的方式将更改部署到其他计算机,包括TEST 和 PROD,无论是 TSQL 脚本还是数据库备份.

对于连比赛都没有完成的事情来说,似乎付出了太多的努力。