предотвратить вставку свойства навигации - PullRequest
0 голосов
/ 14 августа 2011

У меня есть объект A, который используется как свойство навигации для другого объекта B. Я хотел бы контролировать вставку для объекта A. Это означает, что всякий раз, когда я вставляю AI, приходится выполнять другие проверки и обновлять другие объекты.
Но когда я вставляю сущности типа B, он автоматически вставляет подключенные сущности A без необходимых мне проверок и обновлений.

Как мне решить эту проблему?

ОБНОВЛЕНИЕ Iрешил использовать этот ответ как предложено.Но в OnBeforeInsert () я мог бы добавить в контекст новые сущности, которые не будут вызываться их OnBeforeInsert (), поскольку во время вызова var changedEntities = ChangeTracker.Entries(); новых прав еще не было.
Как я могу решитьэто?

1 Ответ

1 голос
/ 14 августа 2011

EF имеет очень мало точек расширения. Так что иногда очень сложно настроить.

Этот ответ является продолжением моего предыдущего ответа

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, вам необходимо настроить его соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...