繁体   English   中英

使用Entity Framework 4.0的延迟加载更新具有导航属性的分离的实体实例

[英]Updating a Detached Entity Instance with Navigation Properties using Lazy Loading with Entity Framework 4.0

我有一个具有导航属性的独立实体:

public class ClassA
{
   public int Id { get; set; }
   public string Name { get; set; }

   public virtual ICollection<ClassB> ClassB
   {
      get
      {
         if (_classB == null)
         {
            var newCollection = new FixupCollection<ClassB>();
            newCollection.CollectionChanged += FixupClassB;
            _classB = newCollection;
         }
         return _classB;
      }
      set
      {
         if (!ReferenceEquals(_classB, value))
         {
            var previousValue = _classB as FixupCollection<ClassB>;
            if (previousValue != null)
            {
               previousValue.CollectionChanged -= FixupClassB;
            }
            _classB = value;
            var newValue = value as FixupCollection<ClassB>;
            if (newValue != null)
            {
               newValue.CollectionChanged += ClassB;
            }
         }
      }
   }
   private ICollection<ClassB> _classB;

   private void FixupClassB(object sender, NotifyCollectionChangedEventArgs e)
   {
      if (e.NewItems != null)
      {
         foreach (ClassB item in e.NewItems)
         {
            item.ClassA = this;
         }
      }

      if (e.OldItems != null)
      {
         foreach (ClassB item in e.OldItems)
         {
            if (ReferenceEquals(item.ClassA, this))
            {
               item.ClassA = null;
            }
         }
      }
   }
}

我的创建方法工作完美。 它将ObjectA实例插入数据库中,然后将集合中的ClassB实例插入数据库中。 该方法只是做:

context.ClassA.AddObject(classA);

但是,当我调用它时,我的更新方法不会插入/更新/删除ClassB的实例。 方法是这样的:

public virtual void Update(List<ClassA> entities, TrialsContext context)
{
   foreach (ClassA entity in entities)
   {
      ClassA original = context.ObjectA.First(x => x.Id == entity.Id)

      if (original != null)
      {
         context.ObjectA.ApplyOriginalValues(original);
         context.ObjectA.ApplyCurrentValues(entity);
      }
   }
}

有什么原因会失败吗? 当我关闭延迟加载并充分充实我的实体时,它可以完美工作,但是,这对性能造成了影响。 我有什么选择?

必须使用自我跟踪实体来实现目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM