【问题标题】:Entity Framework, database wide Guid table, insert order实体框架,数据库范围的 Guid 表,插入顺序
【发布时间】:2014-12-10 19:16:41
【问题描述】:

我们有一个同步框架,它使用全局 SyncEntity 表来跟踪哪些实体在什么时间被更新,这意味着我们有一个具有如下结构的全局表:

<dbo.SyncEntity>
ID int
EntityType int
EntityGuid uniqueidentifier

EntityType 是对应于特定实体的枚举,以便我们知道在哪个表中查找该实体。 我们所有的表都有一个 ID (PK) 和一个 GUID。

我已经从不同的 Entity 表和 SyncEntity 表中的 EntityGuid 创建了一个外键约束。

这非常适合现有数据,但是当我们使用 EntityFramework 插入新数据时,它不会以“正确”顺序插入数据,从而导致错误,因为尚未插入具有所需 EntityGuid 的 SyncEntity。

我想我们可以在所有实体上添加属性 SyncEntity,但我真的不想用该属性污染我们的域模型。

所以我的问题是,无论如何要确保将特定的实体类型作为第一个实体插入? 或者无论如何都可以在没有导航属性的情况下将 Guid(在特定实体上)的关系映射到 EntityGuid(在 SyncEntity 上)。

【问题讨论】:

  • 我知道实体框架可以设置为使用 SP 进行插入。这是一个可以接受的选择吗?

标签: c# sql-server entity-framework


【解决方案1】:

我发现有两种方法可以缓解这个问题。

首先,您可以使用域事件来识别已创建一个新实体并引发一个事件,将实体本身作为参数传递,然后允许该事件创建一个新的SyncEntity 插入它然后保存它.这将填充您的 ID,然后您可以将其分配给创建关系的新实体。

其次,您可以覆盖DbContextSaveChanges 方法来查看添加的实体,然后为每个实体创建一条新记录,然后将您的新SyncEntity ID 分配给实体。

【讨论】:

  • 我的问题不在于实际创建 SyncEntities,问题是即使它们首先插入 DbContext,它们实际上并没有首先刷新到数据库服务器。
  • 控制订单的唯一方法是控制DbContext 的实例以及何时调用SaveChanges。例如,域事件将处理保存两个实体。 SyncEntity 已创建 > SaveChanges 已调用 > SyncEntity ID 已分配给子实体 > SaveChanges 已调用。除此之外,您将需要自定义代码,而 EF 不提供任何开箱即用的功能。触发器还不错,但取决于您希望在应用程序和数据库之间拆分业务逻辑的程度。拆分也会使调试变得更加困难。
【解决方案2】:

你为什么要用这样的东西来打扰 EF?

让触发器在表上创建 SyncEntity 条目。完成的。 EF 不必费心。

它也可以直接使用 SQL。

EF 是一个很好的工具——虽然只是一个非常非常平庸的 ORM。但这并不是解决所有问题的方法。数据库内部逻辑,如日志表,应在数据库中处理。

【讨论】:

  • 我简化了很多用例,使用 SyncEntity 创建了更多逻辑和其他关系。但是当我阅读答案时,无法在 EF 中指定插入顺序。
  • 我坚持我的回答 - 不要为此使用 EF。在数据库中完成这种类型的逻辑并没有错。为正确的工作使用正确的工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多