将实体框架从数据库优先转换为代码优先

Posted

技术标签:

【中文标题】将实体框架从数据库优先转换为代码优先【英文标题】:Convert Entity Framework from Database First to Code First 【发布时间】:2014-10-04 22:42:06 【问题描述】:

我正在尝试将现有数据模型从 Database First 转换为 Code First。

背景

当前的解决方案(摆在我面前)使用数据库项目来定义模型。然后将其发布到数据库,然后我们从所述数据库更新 EDMX 模型。

最后,运行几个 T4 模板以从 EDMX 模型以及 DBContext 生成 POCO 类。

我想摆脱这种情况,并完全采用 Code First 迁移方法。

到目前为止我做了什么

我采用了由 T4 模板生成的 POCO 类,并将它们设为项目的一等公民。 然后我从解决方案中删除了 T4 模板 我采用了 T4 模板生成的 DBContext,并将其作为项目的一等公民。 然后我从解决方案中删除了这个 T4 模板 我从包管理器控制台运行“Enable-Migrations”,它创建了我的 Migrations 文件夹

我还更改了连接字符串以使用 System.Data.SqlClient 提供程序。 是:

<add name="MyContext" connectionString="metadata=res://Project.Data/Model.MyModel.csdl|res://Project.Data/Model.MyModel.ssdl|res://Project.Data/Model.MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MY-SERVER;initial catalog=MY-DB;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

改为:

<add name="MyContext" connectionString="data source=MY-SERVER;initial catalog=MY-DB;integrated security=True;multipleactiveresultsets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

这是我遇到问题的地方

我现在正在尝试创建初始迁移,传递 -IgnoreChanges 标志以便我得到一个空迁移(鉴于数据库的年龄,我希望未来的迁移基于当前架构,而不是创建一个从头开始迁移)。

当我跑步时:Add-Migration InitialCreate -IgnoreChanges

我得到这个错误:

无法加载指定的元数据资源。

当我跑步时:Add-Migration InitialCreate -IgnoreChanges -ConnectionString "data source=MY-SERVER;initial catalog=MY-DB;Integrated Security=SSPI;" -ConnectionStringProviderName "System.Data.SqlClient"

我收到此错误:

无法使用标准覆盖此上下文的连接 DbConnection,因为原始连接是 EntityConnection。

在这里不知所措。似乎即使我删除了对 EDMX 模型的引用,上下文仍然知道它。我想完全摆脱它并采用纯代码优先。

任何帮助表示赞赏。

【问题讨论】:

您是否考虑使用数据库中的 Code First? msdn.microsoft.com/en-us/data/jj200620.aspx 这是我认为我们必须走的方向。鉴于某些...有趣的表继承使用,我试图避免这种情况(仅将基线模型保留在 db 中,并将迁移作为仅在此之后的更改)。不过我会调查一下。 我现在正在使用它,效果很好。如果数据库不遵循实体框架所期望的约定,您可能会遇到一些麻烦,但有一些方法可以绕过它。我发现我必须手动创建几个 EF 需要处理包含的表。 使用下面的链接msdn.microsoft.com/en-us/library/jj591621(v=vs.113).aspx 【参考方案1】:

只需将 InitialCreate.cs 的内容注释掉即可 然后在 PM 中运行

update-database

之后新的迁移将正常工作。

【讨论】:

以上是关于将实体框架从数据库优先转换为代码优先的主要内容,如果未能解决你的问题,请参考以下文章

在生产中使用实体框架(代码优先)迁移

如何从DbContext中清除未插入的POCO? - 实体框架代码优先

从数据库优先实体框架 6.2 中的 SaveChanges 中删除标识列

使用实体框架和代码优先方法创建数据库时,是不是可以从 SSMS 在数据库表上创建索引

实体框架代码优先与 Guid

实体框架代码优先 - 不可为空类型的默认值