保存与两个实体之间的关系N-N关联

问题描述:

我有一个实体框架4.0,带有poco对象。 edmx模型文件是从数据库中生成的。保存与两个实体之间的关系N-N关联

这DataContext的是通过WCF服务访问,它只是意味着我得到了一些对象,我需要将它们附加到当前的DataContext(或与键对应关系重新加载)。

一切似乎都做工精细,除了一种情况:

我有两条表之间的关系NN,所以我的关联表,不超过两个表的ID其他任何领域: Database model

LINQ将其转换为以下模式,这似乎是正确的。 LINQ Data model

当我检索数据时,没有问题,我自己插入到Right_group中的数据正确转换为“我的权限/组中的新对象”。

但是,如果我尝试修改的东西和保存,这是行不通的

public void SaveRights(Group group, List<Rights> rights){ 
    //here, group and rights are objects attached to the database 
    group.Rights.Clear(); 
    group.Rights.AddRange(rights); 
    _dataContext.SaveChanges(); 
} 

所以我的问题是:如何保存这两个对象的“关系”? 谢谢!

+1

**不起作用**不是意外行为的最佳描述。那么如果执行SaveChanges会发生什么?通过附加到数据库,你的意思是你已经将它们加载到_dataContext的同一个实例上? – 2011-02-17 08:34:14

+0

对不起,SaveChanges()完成时,数据不会保存在数据库中。我的意思是,当我发送对象到WCF端时,我分离了我的datacontext的对象,并且它们不再被跟踪。所以当我再次进入我的服务器时,我需要附加这些属性并应用更改 – J4N 2011-02-19 07:31:54

如果你想避免加载从数据库中的对象首先你可以做这样的(代码从我aplications的一个考虑,所以你必须适应它):

public void AddAndRemovePersons(int id, int[] toAdd, int[] toDelete) 
    { 
     var mailList = new MailList { ID = id, ContactInformations = new List<ContactInformation>() };   
     this.db.MailLists.Attach(mailList); 

     foreach (var item in toAdd) 
     { 
      var ci = new ContactInformation { ID = item }; 
      this.db.ContactInformations.Attach(ci); 
      this.db.ObjectStateManager.ChangeRelationshipState(mailList, ci, ml => ml.ContactInformations, System.Data.EntityState.Added); 
     } 

     foreach (var item in toDelete) 
     { 

      var ci = new ContactInformation { ID = item }; 
      this.db.ContactInformations.Attach(ci); 
      this.db.ObjectStateManager.ChangeRelationshipState(mailList, ci, ml => ml.ContactInformations, System.Data.EntityState.Deleted); 
     } 
    } 

我发现删除关系和创建它一样困难,所以我将代码留在那里。这个解决方案的一件事是,在这个函数运行之前,maillist和联系人都存在。我附加他们让国家经理跟踪他们。

如果您要增加您也想救你将使用新对象的

this.db.MailLists.AddObject(you new item here)

我希望帮助!

只是一个想法......如何的关键是建立在Right_Group表?如果您同时使用IDRightIDGroup作为主键 - 可能会出现此问题。一个suggetion是添加新的列(ID)插入Right_Group表,并且具有该ID作为主键。然后分别在其他列上使用外键(IDRightIDGroup)。