【问题标题】:EF6 Code First: when inserting initialize column that occures in multiple tablesEF6 Code First:插入在多个表中发生的初始化列时
【发布时间】:2014-11-27 08:38:57
【问题描述】:

我是实体框架的新手。我有多个具有“排序顺序”列的表。此列声明了行在呈现时应该出现的顺序。

每当通过我的应用程序发生插入时,我希望 DBcontext“检测”存在排序顺序列,并让它自动填充/覆盖这个特定表中的 MAX(排序顺序) + 1 的值。

实现这一目标的最佳方法是什么?我已经尝试过使用数据库触发器,但显然这不适用于 EF。

除此之外,我只能想到一些令人讨厌的反思,或者在我在应用程序中执行的每个插入操作中编写此逻辑(或每个表格至少一次)。

谢谢,

【问题讨论】:

  • 我不认为你想要的很容易或默认情况下由 EF 支持。我会执行以下操作: SortOrder 列的默认值为 9999 或其他值。每个插入都将具有此值。如果自动递增,排序将由两列 SortOrder 和 Id 完成。如果没有,那么我将添加 DateCreated,并将按 SortOrder 和 DateCreated 排序。

标签: c# entity-framework


【解决方案1】:

尝试将属性添加到您的 SorderOrder

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

阅读Entity Framework auto incrementing field, that isn't the Id

【讨论】:

  • 这不会导致我无法更新列中的值吗?是否会对数据库强制执行唯一约束?
  • 这会导致问题:“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'Engines' 中插入标识列的显式值。”}”。阅读后,似乎我必须管理这个 IDENTITY_INSERT为每个表参数自己。这不是我想要做的
【解决方案2】:

让所有具有 SortOrder 列的实例实现一个公开 SortOrder 属性的公共接口 (IHasSortOrder):

public interface IHasSortOrder { int SortOrder { get; set; } }

向 ObjectContext.SavingChanges 事件添加事件处理程序。通过调用 IObjectContextAdapter.ObjectContext 获得 ObjectContext 的一个实例(DbContext 实现了 IObjectContextAdapter):

var octx = (this as IObjectContextAdapter).ObjectContext;
octx.SavingChanges += this.OnSavingChanges;

在此事件处理程序中,您可以访问所有待插入的对象:

ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Added).Select(x => x.Entity).OfType<IHasSortOrder>()

遍历这个集合并按照你想要的方式设置 SortOrder。

【讨论】:

  • 我自己也在尝试一些非常相似的东西。我被你回答的最后一句话卡住了。 “我想要排序顺序的方式”是对应表中的最大值。但是,除非我弄错了(我是新手),否则我无法轻易找到 Entries() 中每个项目的对应表,因为 Entries 中包含的对象非常“抽象”。你能详细说明一下吗?
  • 你说得对,我误解了……你必须去数据库获取这些值。
猜你喜欢
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 2016-08-22
  • 2013-05-08
  • 2012-07-25
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多