C# 将两个实体之间的关系保存为N-N关联

C# 将两个实体之间的关系保存为N-N关联,c#,wcf,linq-to-entities,entity-relationship,C#,Wcf,Linq To Entities,Entity Relationship,我有一个实体框架4.0,带有poco对象。edmx模型文件是从数据库生成的 这个datacontext是通过WCF服务访问的,这只意味着我接收到一些对象,我需要将它们附加到当前datacontext(或者使用密钥对应重新加载它们) 除了一种情况外,一切似乎都很正常: 我在两个表之间有一个N-N关系,所以我有一个关联表,除了两个表的ID之外没有任何字段: LINQ将其转换为以下模式,这似乎是正确的。 当我检索数据时,没有问题,我在Right_组中插入的数据被正确地转换为“我的权限/组集合中的新

我有一个实体框架4.0,带有poco对象。edmx模型文件是从数据库生成的

这个datacontext是通过WCF服务访问的,这只意味着我接收到一些对象,我需要将它们附加到当前datacontext(或者使用密钥对应重新加载它们)

除了一种情况外,一切似乎都很正常:

我在两个表之间有一个N-N关系,所以我有一个关联表,除了两个表的ID之外没有任何字段:

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

当我检索数据时,没有问题,我在Right_组中插入的数据被正确地转换为“我的权限/组集合中的新对象”

但是,如果我试图修改某些内容并保存,它将不起作用

 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();
 }
public void保存权限(组、列表权限){
//在这里,组和权限是附加到数据库的对象
group.Rights.Clear();
group.Rights.AddRange(权限);
_dataContext.SaveChanges();
}
所以我的问题是:如何保存两个对象的“关系”?
谢谢大家!

如果您想避免首先从数据库加载对象,可以这样做(代码取自我的一个应用程序,因此您必须对其进行调整):

public void addandremoveepersons(int-id,int[]toAdd,int[]toDelete)
{
var mailList=new mailList{ID=ID,ContactInformations=new List()};
this.db.MailLists.Attach(邮件列表);
foreach(toAdd中的var项目)
{
var ci=新联系人信息{ID=item};
此.db.ContactInformations.Attach(ci);
this.db.ObjectStateManager.ChangeRelationshipState(邮件列表、ci、ml=>ml.ContactInformation、System.Data.EntityState.Added);
}
foreach(toDelete中的变量项)
{
var ci=新联系人信息{ID=item};
此.db.ContactInformations.Attach(ci);
this.db.ObjectStateManager.ChangeRelationshipState(邮件列表、ci、ml=>ml.ContactInformation、System.Data.EntityState.Deleted);
}
}
我发现删除关系和创建关系一样困难,所以我把代码留在了那里。此解决方案的一个特点是,在运行此函数之前,邮件列表和联系人都存在。我附加它们以使州经理跟踪它们

如果要添加也要保存的新对象,请使用

this.db.MailLists.AddObject(您可以在此处添加新项目)


我希望这有帮助

只是一个想法。。。如何在
右侧组
表中设置键?如果同时使用
IDRight
IDGroup
作为主键,则可能会出现此问题。一个建议是将一个新列(
ID
)添加到
Right_Group
表中,并将此
ID
作为主键。然后分别在其他列(
IDRight
IDGroup
)上使用外键。

无效不是意外行为的最佳描述。那么,如果执行SaveChanges会发生什么呢?附加到数据库是指您已将它们加载到_dataContext的同一个实例上吗?对不起,当SaveChanges()完成时,数据不会保存在数据库中。我的意思是,当我将对象发送到WCF端时,我分离了datacontext的对象,它们不再被跟踪。因此,当我再次进入服务器时,我需要附加这些属性并应用更改我在parralells中发现,使用ChangeRelationShipState是我问题的关键。这有点脏,但它可以工作。事实上,我认为,因为我在POCO对象中使用的是ObservableCollection而不是List,所以LINQ无法按照自己的意愿跟踪它们。对于EF和POCO,我认为必须使用ICollection,以便EF可以覆盖集合。不过,我现在找不到我在哪里读的:/
    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);
        }
    }