我有一个实体A用作另一个实体B的导航属性。我想控制实体A的插入。但是,每当我插入AI时,都必须执行其他检查并更新其他实体。
但是当我插入B类实体时,它会自动插入连接的A实体,而不需要我需要的额外检查和更新。
我该如何解决这个问题?
更新
我决定按照建议使用this answer。但是在OnBeforeInsert()中,我可能会在上下文中添加一个新实体,因为在调用var changedEntities = ChangeTracker.Entries();
时,新的权限尚不存在,因此不会调用它们的OnBeforeInsert()。
我该如何解决这个问题?
答案 0 :(得分:1)
EF的扩展点很少。所以有时很难定制。
此答案是我的previous answer
的扩展public abstract class Entity
{
public virtual void OnBeforeInsert(){}
public virtual void OnBeforeUpdate(){}
}
public class Category : Entity
{
public string Name { get; set; }
public string UrlName{ get; set; }
public override void OnBeforeInsert()
{
//ur logic
}
}
然后在DbContext
班级订阅ObjectStateManagerChanged
ObjectStateManager
事件。
public class MyContext : DbContext
{
public override int SaveChanges()
{
//intercept entity changes
UnderlyingObjectContext.ObjectStateManager.ObjectStateManagerChanged
+= OnObjectStateManagerChanged;
var changedEntities = ChangeTracker.Entries();
foreach (var changedEntity in changedEntities)
{
if (changedEntity.Entity is Entity)
{
var entity = (Entity)changedEntity.Entity;
switch (changedEntity.State)
{
case EntityState.Added:
entity.OnBeforeInsert();
break;
case EntityState.Modified:
entity.OnBeforeUpdate();
break;
}
}
}
return base.SaveChanges();
}
ObjectContext UnderlyingObjectContext
{
get
{
return ((IObjectContextAdapter)this).ObjectContext;
}
}
void OnObjectStateManagerChanged(object sender, CollectionChangeEventArgs e)
{
if (e.Action == CollectionChangeAction.Add)
{
//not all added entities are new
if (UnderlyingObjectContext.ObjectStateManager
.GetObjectStateEntry(e.Element).State == EntityState.Added)
{
if (e.Element is Entity)
{
((Entity)e.Element).OnBeforeInsert();
}
}
}
}
}
如果您使用的是EF 4.0,则需要相应地对其进行自定义。