EF6 代码优先:插入初始化多个表中出现的列时

本文关键字:代码 初始化 插入 EF6 | 更新日期: 2023-09-27 18:32:07

我是实体框架的新手。我有多个表,其中有一个"排序顺序"列。此列声明行在呈现时应按的顺序显示。

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

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

除此之外,我只能想到一些令人讨厌的反思,或者在我在应用程序中执行的每个插入中对此逻辑进行编码(或为每个选项卡至少编写一次)。

谢谢

EF6 代码优先:插入初始化多个表中出现的列时

尝试向SorderOrder列添加属性

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

读取实体框架自动递增字段,该字段不是 Id

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

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

将事件处理程序添加到 ObjectContext.SavingChanges 事件。通过调用 IObjectContextAdapter.ObjectContext (DbContext 实现 IObjectContextAdapter),您可以获得 ObjectContext 的实例:

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。