将Entity Framework从数据库优先转换为代码优先

17

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

背景

当前解决方案(在我之前实施)使用数据库项目来定义模型。然后发布到数据库,然后我们从该数据库更新EDMX模型。

最后,运行了一些T4模板,从EDMX模型生成POCO类以及DBContext

我想摆脱这种方式,纯粹采用Code First迁移方法。

我所做的事情

  • 我已经将由T4模板生成的POCO类拿出来,使它们成为该项目的一等公民。
  • 我随后从解决方案中删除了T4模板
  • 我取出了由T4模板生成的DBContext,也使其成为该项目的一等公民。
  • 我随后从解决方案中删除了这个T4模板
  • 从包管理器控制台中,我运行了“Enable-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。

感谢任何帮助。


1
你考虑过使用来自数据库的Code First吗?http://msdn.microsoft.com/en-us/data/jj200620.aspx - Ashok Padmanabhan
那是我认为我们将不得不走的方向。鉴于一些有趣的表继承用法,我本来想避免这种情况(只在数据库中保留基线模型,并进行迁移以进行后续更改)。不过我会研究一下这个问题。 - Brendan Green
我现在正在使用它,而且它运行得非常好。如果数据库不遵循Entity Framework所期望的约定,您可能会遇到一些麻烦,但有解决方法。我发现我需要手动创建一些EF需要处理包含内容的表。 - Ashok Padmanabhan
请使用以下链接 https://msdn.microsoft.com/zh-cn/library/jj591621(v=vs.113).aspx - Diceyus
你已经尝试过这个教程了吗?https://learn.microsoft.com/en-us/ef/ef6/modeling/code-first/workflows/existing-database在第一步中,它会让你创建一个示例数据库,然后在第三章“反向工程模型”中变得有趣。选择“从数据库生成 Code First”,并按照步骤进行操作。 - Matt
2个回答

1

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

update-database

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


-2

问一个基本问题:数据库中有多少个表,是否值得用另一套杂乱无章的工具替换掉一堆构建/部署工具的房子?

对于一个拥有400多个表的EF解决方案,我们会在每个产品发布时逐步进行替换。

我们逐步用每个版本中的几个表替换C# EF使用,并最终淘汰了所有第三方构建/部署工具和旧的EF代码。

按功能区块替换它们,同时替换该功能区块中表的使用。

由于复杂性越来越高,我们停止使用EF迁移。


我们停止使用EF迁移,因为随着时间的推移,由于复杂性,它们的成本越来越高。...听起来你做错了事情。你也没有提到你用什么替代它,所以这只是一个扩展评论,没有直接回答OP的问题。专业提示:如果其他人有类似的经历,请学会将迁移重新基于特定版本。 - Chris Schaller
应用程序被萨班斯-奥克斯利法案所覆盖,需要由数据库管理员审核所有的数据库更改。数据库管理员不愿意审查由EF生成的升级SQL脚本——因为它们过于复杂,是通用自动生成的模式更改代码。 - snj
好吧,祝你更加强大。我经常将解决方案转换为使用迁移,主要是为了减少模式更改代码并对其进行控制,也许最重要的是模式逻辑与其他源代码一起进行版本控制。我猜每个人都有自己的做法,但是你的回答实际上并没有帮助到提问者解决问题,所以这个观点无关紧要。在你对工具失去信心之前,我很乐意帮助你解决问题的;) - Chris Schaller
EF的作用是让你选择谁拥有模式的所有权。Code First Migrations意味着代码“拥有”模式,这通常对我们构建的应用运行时非常重要,数据库管理员做看似微小的更改可能会破坏整个应用程序,而他们并不知道,因为他们不使用该应用程序。如果你不能把模式的所有权交给代码,那么它就不适合你的解决方案。你可以采用混合方法,让EF管理应用程序模式,让数据库管理员在其他模式上为所欲为,但无论如何他们都会成为你的绊脚石 ;) - undefined
嗨Chris,非常感谢你的所有评论。所讨论的数据库被多个应用程序使用,并由数据所有者拥有。数据所有者对模式更改有最终批准权。我们是一个团队,必须提出我们的更改建议并获得批准。所讨论的系统是一个金融系统,受到政府监管的覆盖,要求对任何模式更改的SQL脚本进行批准和检查。强制其他团队,包括我们应用程序的前端开发人员和数据库管理员学习C# EF迁移是行不通的。我们还必须审查其他团队为Java应用程序所做的模式更改。 - undefined
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接