ApplyPropertyChanges和References

时间:2009-07-14 20:03:27

标签: asp.net linq entity-framework linq-to-entities

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

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 个答案:

答案 0 :(得分:1)

是的,这是一个名为“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是引用(不是集合),并且不为null。

希望这有助于 亚历

PS在.NET 4.0 Beta2中,名为FK associations的内容将解决此问题,并使其成为可行的代码。