防止导航属性插入

时间:2011-08-13 22:03:31

标签: c# .net entity-framework

我有一个实体A用作另一个实体B的导航属性。我想控制实体A的插入。但是,每当我插入AI时,都必须执行其他检查并更新其他实体。
但是当我插入B类实体时,它会自动插入连接的A实体,而不需要我需要的额外检查和更新。

我该如何解决这个问题?

更新 我决定按照建议使用this answer。但是在OnBeforeInsert()中,我可能会在上下文中添加一个新实体,因为在调用var changedEntities = ChangeTracker.Entries();时,新的权限尚不存在,因此不会调用它们的OnBeforeInsert()。
我该如何解决这个问题?

1 个答案:

答案 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,则需要相应地对其进行自定义。