实体框架 v4 - POCO 与 Code-Only 之间有什么区别?
-
06-07-2019 - |
题
我的印象是
- EF 与 POCO:允许您将自己的 POCO 映射到模型 (.edmx) 上的实体。
- 仅 EF 代码: 不 edmx /模型设计师(即。CSDL/SSDL/MSL(统称为 EDMX)元数据)。仍然是 POCO,但映射、关系、导航等都是 手动 编码(因此只有代码,描述)。
如果这两个概念的描述(或多或少)是正确的,为什么有人会用 POCO 来做 Code-Only 而不是 EF?
两者都在进行 POCO,但第二个有额外的负担,还必须手动进行映射?
解决方案
- 如果您想手动编写映射而不必费力地通过 XML,那么仅使用代码就非常有用。而且 edmx 设计器在 50 个左右的模型之后会变得笨重,使用这种方式只是一种负担。
当映射 XML 内部出现问题时,它实际上是一个 PITA,可以在 xml 中进行挖掘以进行所需的修复。如果您在某些情况下开始手动编辑 xml,设计器也会中断。
现在我不知道细节,但 EF1 中的设计器并不支持所有可用的映射选项。EF4 设计器有一些改进(我想到的是关系的一种方式),但我不确定它是否具有与手动映射同等的功能。
- 是的。
其他提示
我要在 jfar 的答案中添加的唯一一点是,使用 Code-Only 你不需要 有 创建映射。
大多数时候可以通过约定推断映射。
关于视图预生成的观点很重要。我没有听说微软有意为纯代码提供预生成。如果有人知道不同请发帖。
我对 400 个表使用了仅代码,作为关于是否使用 EF4 还是 NHibernate 的调查的一部分,并且视图生成有 80 秒的初始延迟 - 与使用设计器时完全相同,但使用设计器视图预先生成是可能的,这将延迟缩短至 10 秒。如果您不喜欢拆分模型并且您有超过 75 个表,请不要仅使用代码。
我认为仅代码目前不允许您预先生成视图,因此可能会产生性能成本。不过,这可能会在发布前发生变化。
还有一点没有提到的是,当使用仅代码时,您可以对语法进行完整的编译时检查。如果您将可视化设计器与 EDMX 一起使用,您会得到一些编译时检查,但它是有限的。对于较大的模型,EDMX 变得极其笨拙,手动编写 CSDL、SSDL 和 MSL 是使用 XML 映射管理超大型模型的唯一合适方法。如果您手动管理映射,则不会进行任何编译时检查。
通过仅使用代码,即使您需要使用数百或数千个实体,您也可以对任何大小的模型进行完整的编译时检查。它还会减少“混乱”,因为您的最终产品都是编译后的程序集,而不是程序集和各种 xml 文件的混合。