实体框架 4:为所有实体创建单个图表有意义吗?

2023-12-27

我写了一些关于实体框架的假设,然后是几个问题(所以请纠正我错误的地方)。我正在尝试将 POCO 与 EF 4 一起使用。

我的假设:

  • EF 图只能存在一个数据上下文。
  • 数据上下文可以引用多个实体。
  • 如果您有两个数据源,例如 MS SQL Server 和 Oracle,则 EF 需要两个不同的图表来访问数据。
  • EF 图数据上下文是“工作单元”,对于图中的任何内容都有一个 Save()。 (当然,您可以将其包装在 UnitOfWork 类中,但它本质上具有相同的职责)。

假设这是正确的,这是我的问题:

  • 如果您不将所有实体保留在同一个 EF 图上,那么如何维护数据完整性,例如没有“客户”就不能存在“订单”?这仅仅是存储库加载数据以验证完整性的功能,还是我们“尝试/捕获”数据库引用完整性错误?

  • 您不会为每个实体创建一个 EF 图吗?例如,我不希望对客户的更改和对产品的更改一起编写,因为它们彼此无关(将它们放在同一个图表上会导致它们一起编写)。或者 EF 图的范围是否涵盖存储在同一存储介质中的所有类似实体?

像这样划分实体是常态吗,还是只有一个图表包含所有实体?我会认为是后者,但这种想法已经占据了我的上风。


使用一个包含所有实体的大型 EDM 通常不是一种好的做法,也不建议这样做。
使用一台大型 EDM 会导致一些问题,例如:

元数据加载时间的性能问题:
随着模式文件大小的增加,解析和创建该元数据的内存模型所需的时间也会增加。

视图生成中的性能问题:
视图生成是将用户提供的声明性映射编译为客户端实体 Sql 视图的过程,该视图将用于查询实体并将其存储到数据库中。该进程在第一次查询或 SaveChanges 发生时运行。视图生成步骤的性能不仅取决于模型的大小,还取决于模型的互连程度。如果两个实体通过继承链或关联连接,则称它们是连接的。同样,如果两个表通过外键连接,则它们是连接的。随着模式中连接的实体和表的数量增加,视图生成成本也会增加。

杂乱的设计师界面:
当您从大型数据库模式生成 Edm 模型时,设计器界面上充斥着大量实体,很难理解实体模型的总体外观。如果您对实体模型没有很好的了解,您将如何自定义它?

Intellisense 体验不是很好:
当您从包含 1000 个表的数据库生成 Edm 模型时,您最终将得到 1000 个不同的实体集。想象一下,当您输入“上下文”时,您的智能感知体验会如何。在 VS 代码窗口中。

混乱的 CLR 命名空间:
由于模型架构将具有单个 EDM 命名空间,因此生成的代码会将类放置在单个命名空间中。

有关更详细的讨论,请查看在实体框架中使用大型模型 - 第 1 部分 http://blogs.msdn.com/b/adonet/archive/2008/11/24/working-with-large-models-in-entity-framework-part-1.aspx?wa=wsignin1.0

解决方案:
虽然没有现成的解决方案,但它建议您应该模型中自然断开的子集这意味着,根据您的领域模型,您应该提出不同的领域模型集,每个域模型都包含相关对象,而每个集都是不相关的并且与另一个集断开连接。中间没有外键可能是分离的好兆头。这是有道理的,因为在大型模型中,您的应用程序通常不需要将数据库中的所有表映射到一个实体模型才能工作。

即使这种分离不是 100% 可能的(这意味着某些表的子集具有指向数据库中其他表的外键),它仍然鼓励您将它们分开。当您这样做时,您必须承担适当设置外键的责任。没有导航属性允许您获取表示该外键的实体。当然,如果需要,您可以在其他容器中手动查询该实体。

此外,有关如何在重用类型时将一个大型实体模型拆分为较小实体模型的一些提示和技巧,请查看:在实体框架中使用大型模型 - 第 2 部分 http://blogs.msdn.com/b/adonet/archive/2008/11/24/working-with-large-models-in-entity-framework-part-2.aspx

关于你的问题:Order and Customer属于同一自然域,应保存在同一 EDM 中。就像我说的,您可以将它们分散在 2 个不同的实体数据模型上,但是您必须负责设置适当的外键,否则您将得到运行时异常,同样的道理,Customer and Product应保存在单独的实体数据模型中。遵循这些规则,您可以在数据访问层中提出明确定义的域集设计。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架 4:为所有实体创建单个图表有意义吗? 的相关文章

  • 实体框架 POCO - 如果字段更新两次如何防止错误?

    我正在开始使用模型优先配置中的 POCO 实体框架 我有一个稍微不标准的模型 通过自定义 tt 文件生成以响应 edmx 中的自定义属性 使我能够触发 NotifyPropertyChanged 事件来记录对某些属性的更新 这导致一个实际上
  • 无法返回json数据,WCF Restful Service .NET 4.0

    我最近使用 Entity Framework 4 0 设置了 WCF Restful 服务 它与 XML 完美配合 但是当我尝试以 json 格式返回它时 我得到了 HTTP 1 1 504 Fiddler Receive Failure
  • EF4 仅代码映射继承

    我有以下型号 我想要ShiftRequest and MissionRequest在数据库中有一个表 public class RequestBase public int Id get set public DateTime Reques
  • 实体框架 - 仅加载选定的属性

    我没有 EF 的实际经验 因此不知道这个问题的相关性 假设我有名为 Student 的表 StudentId Name Username Address DOB DeptId NavigationProp1Id 和 Department 表
  • 向 POCO 类添加方法

    我有以下设置 MVC gt 服务 gt 存储库 现在我想让用户能够向文档添加注释 只有与文档关联的用户 作为所有者或审阅者 才能添加注释 因此在我的 NoteService 中 我执行以下操作以确保用户对所选文档具有权限 public No
  • EF Code-First 中查找表的最佳实践

    我正在使用 EF 做我的第一个项目 并且计划采用代码优先模型 我正在尝试找到一些有关处理相当经典的 查找表 场景的指导 我正在处理一个非常规范的情况 我将保留地址数据 所以 我有一个简单的地址 DTO public class Addres
  • 使用 Entity Framework 4 删除对象的最简单方法

    确认 我是实体框架的新手 正在尝试找到删除项目的最简单方法 我有一个列表框 其数据源设置为数据库中的 TagCategory 对象 这工作正常 现在我想删除所选项目 所以我做了这样的事情 TagCategory category TagCa
  • 如何在不往返的情况下更新实体? (EF 4)

    我尝试了以下方法 public void UpdatePlayer int id Player player new Player ID id player Password 12 Entities Players Attach playe
  • 如何更新实体?

    我之前有一个更详细的问题 但我没有答案 我将以更简单的方式提出同样的问题 I have an EF database with foreign key to another table 我想UPDATE an ENTITY 但我需要这样 我
  • 生成实体密钥

    我第一次对 Entity Framework 4 感到失望 事实证明 当 SQL CE 与 EF4 一起使用时 不支持自动生成主键 http social msdn microsoft com forums en US sqlce thre
  • 是否可以在 Lambda 表达式中包含 SqlFunctions.StringConvert?

    我一直在学习表达式并使用下面的代码添加针对数据库模型构建的表达式 EF4 ORACLE 而不是 SQL 这非常适合 Oracle 并允许我动态构建谓词 例如 CustomerId Contains 2 into f gt f Custome
  • 如何在 EF4 中获取实体的第一个 EntityKey 名称

    如何获取 Entity Framework 4 实体的第一个 EntityKey 名称 因为我正在构建存储库系统 并且我想通过 Id 获取项目 EF 中的主键是实体的第一个实体键 我正在使用这个代码 public virtual TEnti
  • 实体框架 4.1:重写 IEnumerable 验证

    public abstract class Animal IValidatableObject public string Id get set public string Name get set public virtual IEnum
  • 将 XML 映射到 C# 中的类

    我希望使用 XmlSerializer 对象将嵌套元素中的多个 XML 属性映射到单个 POCO 类中 XML
  • 为什么我收到错误“无法设置类型 Y 上的属性 X,因为集合已设置为 EntityCollection”?

    当我尝试将一个集合映射到 EF4 中的另一个集合时 出现此错误 无法设置类型 Resource EF810770B4FCA2E071F38C2F2EE328AAC216CA2A7BF157503E6658A42D7CF53A 的属性 Res
  • 在实体框架中设置获取大小

    我正在将 ado net 代码转换为使用 EF 在我的 ado net 代码中我设置dataReader FetchSize command RowSize 1000与默认的获取大小相比 这极大 地提高了性能 当我将代码转换为 EF 时 性
  • 在 Silverlight 中使用 RIA 服务时如何扩展实体?

    在我的 Silverlight 解决方案的服务器端 我有 2 个项目 提供 Silverlight 页面的网站 实体框架数据访问层 我有一个具有 FirstName 和 LastName 属性的实体 我想添加一个可从 Silverlight
  • 实体框架 - 悲观锁定

    我想做的基本上是NHibernate 做什么 http knol google com k nhibernate chapter 10 transactions and concurrency 10 282E 296 282E 29 28C
  • EF4如何在多对多关系中公开联接表

    假设我有以下表格 Essence EssenceSet 和 Essence2EssenceSet 其中 Essence2EssenceSet 仅保存前 2 个表的 ID 以形成 M M 关系 在 EF 中 由于 Essence2Essenc
  • EF存储库模式多对多插入

    我们有 2 张桌子 表权限 public class Authority public int ID get set public string Name get set 表代理 public class Agent public int

随机推荐