2014-12-21 205 views
1

今天早上我偶然發現了Entity Framework的一個問題。實體框架 - 多對多關係不保存到數據庫

我有以下代碼映射修改的實體並將其保存到數據庫中。

public Group Save(Group x) 
    { 
     using (var db = new HostContext()) 
     { 
      db.Projects.Attach(x.Project); 

      if (x.ID != 0) 
      { 
       db.AttachableObjects.Attach(x); 
       var manager = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager; 
       manager.ChangeObjectState(x, EntityState.Modified); 
      } 
      else 
      { 
       db.AttachableObjects.Add(x); 
      } 

      db.SaveChanges(); 
      return x; 
     } 
    } 

我打電話給現有組的Save方法作爲參數。組包含一個我想添加爲用戶的用戶。

該方法成功完成,但該關係不會在數據庫中保留。 任何幫助非常感謝。

編輯:這是我的班

class User : AttachableObject 
{ 

    ... 

    private List<Group> memberof; 

    [DataMember] 
    [InverseProperty("Members")] 
    public List<Group> MemberOf 
    { 
     get { return memberof; } 
     set { memberof = value; } 
    } 

    ... 
} 

class Group : AttachableObject 
{ 

    ... 

    private List<User> members; 

    [DataMember] 
    [InverseProperty("MemberOf")] 
    public List<User> Members 
    { 
     get { return members; } 
     set { members = value; } 
    } 

    ... 
} 

EDIT2:這是保存方法被稱爲

public Group AcceptInvite(int id) 
    { 
     var mapper = new InviteMapper(); 
     var userMapper = new UserMapper(); 
     var groupMapper = new GroupMapper(); 

     var invite = mapper.Find(id); 

     if (invite != null) 
     { 
      var group = groupMapper.Find(invite.GroupID); 
      var user = userMapper.Find(invite.InviteeID); 

      group.Members.Add(user); 

      mapper.Delete(invite.ID); 
      return groupMapper.Save(group); 
     } 

     return null; 
    } 

EDIT3:我的映射器

public class GroupMapper 
{ 
    public Group Find(int id) 
    { 
     using (var db = new HostContext()) 
     { 
      return db.AttachableObjects 
       .Include("Project") 
       .OfType<Group>().FirstOrDefault(x => x.ID == id); 
     } 
    } 
} 

映射器的其餘部分是一樣的,只用自己的表。

回答

0

您並未更改Project的關係信息,您只是將x設置爲修改,關係信息必須明確更改。

因此x.Project必須有一些屬性指向Group,您需要設置它以便記錄更改。

我在猜測x是通過一些反序列化過程復活的嗎?

+0

對不起,我可能沒有清楚描述我的問題。未映射的關係是類User和Group之間的M:N關係。我用上述類的代碼編輯了我的原始文章。組的成員包含我想成爲成員的用戶(x)。 – Folio

+0

我明白了..你什麼時候將用戶對象添加到組中?這是否會發生,然後該對象是ser/deser? –

+0

使用ef從數據庫中獲取用戶和組對象,然後將用戶添加到組中,並將該組用作我在我的問題中發佈的Save方法中的參數。這些對象不是反序列化的。 – Folio