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

Posted

技术标签:

【中文标题】无法使用实体框架代码优先创建具有凭据的数据库?【英文标题】:Cannot Create Database with credentials using Entity Framework Code-First? 【发布时间】:2020-05-24 03:35:46 【问题描述】:

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

我开始创建模型,一切都很好,然后启用了迁移和添加迁移,一切正常,但是当我运行 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'.

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

提前致谢

【问题讨论】:

【参考方案1】:

操作:

我想创建一个数据库,使用凭证code-first

...和:

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

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

    数据库尚不存在 连接字符串正在请求显式登录 说 SQL 中尚不存在登录名 因为数据库不存在

OP 的配置:

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

那么解决办法是什么?

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

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

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

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

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

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

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

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

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

对于一些甚至没有完成比赛的事情来说,这似乎是一个很大的努力。

【讨论】:

非常感谢您的反馈,非常感谢您提供的两种解决方案,正如您在我谈到的“可信连接”问题中看到的那样,我实际上使用了第一种解决方案,它将变成集成安全本身而且我在生产方面看到了一些安全问题,第二个解决方案几乎来自现有数据库的代码优先,这导致脚手架,并不是每个人都喜欢反转数据库,我不明白代码优先的意义数据库已经存在。 @Null 不客气。是的,完全正确,代码优先非常适合新领域。但是,EF 代码优先与 MS 处理 XML SOAP 服务的方式非常相似。他们还采用了代码优先的方法,编译器在事后吐出 WSDL。然后人们想知道为什么在更大的 EAI Java 空间中没有人使用 XML SOAP 服务。在这两种情况下,模式优先是更好的方法。如果您觉得如此,请不要忘记接受作为答案/赞成以上答案 我使用 Code-First 方法的主要目的是能够迁移到 EF Core,因为它只支持 code-first,但似乎这会花费我不喜欢的安全性那个案子。 @Null 好吧。它也可能是短暂的,因为 .NET 5(它是开源和跨平台的)即将在年底推出,MS 将再次返回单一框架。将不再有 .NET Core xxx,当然包括 EF Core。然而,在数据库优先/代码优先空间中将会发生什么还有待观察。祝您一切顺利,感谢您的接受! :) @MicyD 非常感谢您提供的答案以及关于 .NET 5 的信息,这对我来说是新的,我不知道,再次感谢。

以上是关于无法使用实体框架代码优先创建具有凭据的数据库?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 实体框架:无法创建索引

无法使用 DbContext 实体框架核心 SaveChanges()

如何将实体框架(代码优先)与动态创建的连接字符串和单文件数据库一起使用?

实体框架代码优先 CTP5:如何定义非原始类型

使用实体框架、代码优先和 CRUD 操作的存储库模式

实体框架 MySQL DbContext 无法连接