有没有人将实体框架与代码优先方法与 Edmx 文件混合使用?

Posted

技术标签:

【中文标题】有没有人将实体框架与代码优先方法与 Edmx 文件混合使用?【英文标题】:Have anyone used Entity Framework with code first approach mixed with Edmx file? 【发布时间】:2011-12-06 07:59:09 【问题描述】:

我目前分配到一个项目,他们的遗留系统设计得非常糟糕,并且过于关注数据库设计。我试图组合一个新的设计,让客户可以一点一点地迁移遗留系统。

他们目前使用的是 EF 4.1,但不是代码优先方法,实体描述/映射位于 edmx 文件中。他们每次想要扩展模型时都会进行逆向工程(首先在数据库中进行更改,然后通过自定义工具将它们向上反映到模型层)。

我想知道的是,是否有人在映射类中使用过 edmx 和代码优先方法。有什么缺点需要了解吗?

【问题讨论】:

【参考方案1】:

只有在每种方法都有单独的上下文类型时,才能一起使用 EDMX 和代码映射(不能在单一上下文类型中混合使用方法)。这可能是最大的缺点,因为它会导致更复杂的代码和维护。

例如,如果您需要在两种上下文类型中都有一些实体以将其与新代码和旧代码一起使用,则您必须维护其映射两次。您还必须非常小心不要复制实体类本身 = 您的代码首先必须使用由 EDMX 的自定义工具生成的类,但如果他们在当前解决方案中不使用 POCO,这将是不可能的。

另一个问题是数据库完整性。如果您需要在单个事务中保存对两种上下文类型的更改,则必须使用 TransactionScope 和分布式事务 = MSDTC(每个上下文实例将处理自己的数据库连接)。

如果您确定将迁移整个系统,您可能会考虑使用代码优先而不是 EDMX(但请注意,代码优先映射和 DbContext 通常提供更有限的功能集)。如果您不确定是否能够完成整个迁移,甚至不要考虑先使用代码,因为让系统处于一半先使用代码,一半使用 EDMX 的状态只会让一切变得更糟,更可怕。

确定有点理论,因为在软件开发中,您唯一可以确定的是需求/情况会发生变化。这意味着应该非常仔细地考虑迁移。

【讨论】:

好答案。谢谢。我确实意识到事务的问题,但迁移可能会通过 Aggregate root 使用 Aggregate root 来完成。从依赖较少的外部根开始,向具有复杂依赖的中心根工作。我们会先做一个测试秒杀,看看效果如何。【参考方案2】:

我也对这个问题感到震惊。我发现您可以在“Ado.NET 实体模型项目”中对数据库进行建模并“从模型生成数据库”。

但是你不能在那个项目中创建存储过程,你唯一能做的就是你可以从服务器导入存储过程。

但如果你不想在服务器上创建存储过程,你可以在 VS 上创建另一个项目,“SQl CLR 数据库项目”,你可以在那个项目中编写你的存储过程和老虎并将它们部署到服务器。

然后您可以通过“Update Model From Database”再次从“Ado.NET Entity model Project”导入这些存储过程。

同样,您可以使用两种方法(代码优先和模型优先)开发服务器项目

希望这会增加更多内容:)

【讨论】:

以上是关于有没有人将实体框架与代码优先方法与 Edmx 文件混合使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义与 EDMX(模型优先)实体框架 4.1 一起使用的表名?

使用实体框架映射数据库的方法?

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

实体框架数据库优先工作流设计器失败

代码优先与模型/数据库优先[关闭]

实体框架迁移错误 - 序列不包含任何元素