C# 将两个实体之间的关系保存为N-N关联
我有一个实体框架4.0,带有poco对象。edmx模型文件是从数据库生成的 这个datacontext是通过WCF服务访问的,这只意味着我接收到一些对象,我需要将它们附加到当前datacontext(或者使用密钥对应重新加载它们) 除了一种情况外,一切似乎都很正常: 我在两个表之间有一个N-N关系,所以我有一个关联表,除了两个表的ID之外没有任何字段: LINQ将其转换为以下模式,这似乎是正确的。 当我检索数据时,没有问题,我在Right_组中插入的数据被正确地转换为“我的权限/组集合中的新对象” 但是,如果我试图修改某些内容并保存,它将不起作用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_组中插入的数据被正确地转换为“我的权限/组集合中的新
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);
}
}