代码之家  ›  专栏  ›  技术社区  ›  Graham Conzett

应用属性更改和引用

  •  1
  • Graham Conzett  · 技术社区  · 16 年前

    我之前问过这个问题,但我认为我的措辞不正确,所以这里是第二次尝试。我有以下代码:

    public User EditUser(User userToEdit)
    {
        //userToEdit contains values for eagerly loaded contacts entity
    
        User originalUser = (from u in _entities.UserSet.Include("contacts")
                                     where u.ID == userToEdit.ID
                                     select u).FirstOrDefault();
    
        _entities.ApplyPropertyChanges(originalUser.EntityKey.EntitySetName, userToEdit);
        _entities.SaveChanges();
    
        return userToEdit;            
    }
    

    挺直的。但是,联系人实体没有更新。据我所知,急着加载会将实体添加到数据上下文中,因此当使用分离的UserToEdit调用ApplyPropertyChanges时,对UserToEdit中联系人的更改将通过应用到附加的联系人实体。我错过了什么?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Alex James    16 年前

    是的,这是所谓的“不幸的副作用” Independent Associations

    在EF中(至少在3.5 SP1中),关系不被视为实体的一部分,即存在独立关系。

    这意味着打电话 ApplyPropertyChanges(...) 只影响实体结构部分的属性,而不影响引用。

    因此,您需要将代码更改为:

    public User EditUser(User userToEdit){    
        //userToEdit contains values for eagerly loaded contacts entity    
        User originalUser = (from u in _entities.UserSet.Include("contacts")                                 
            where u.ID == userToEdit.ID                                 
            select u).FirstOrDefault();  
    
        _entities.ApplyPropertyChanges(originalUser.EntityKey.EntitySetName, userToEdit);  
        originalUser.Contacts = userToEdit.Contacts;
        _entities.SaveChanges();    
        return userToEdit;            
    }
    

    这假定usertoedit.contacts是引用(不是集合),并且不是空值。

    希望这有帮助 亚历克斯

    在.NET 4.0 beta2中的ps称为 FK associations 将解决此问题,并使其生效,以便您的代码可以工作。