保存与两个实体之间的关系N-N关联
问题描述:
我有一个实体框架4.0,带有poco对象。 edmx模型文件是从数据库中生成的。保存与两个实体之间的关系N-N关联
这DataContext的是通过WCF服务访问,它只是意味着我得到了一些对象,我需要将它们附加到当前的DataContext(或与键对应关系重新加载)。
一切似乎都做工精细,除了一种情况:
我有两条表之间的关系NN,所以我的关联表,不超过两个表的ID其他任何领域:
LINQ将其转换为以下模式,这似乎是正确的。
当我检索数据时,没有问题,我自己插入到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();
}
所以我的问题是:如何保存这两个对象的“关系”? 谢谢!
答
如果你想避免加载从数据库中的对象首先你可以做这样的(代码从我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
表?如果您同时使用IDRight
和IDGroup
作为主键 - 可能会出现此问题。一个suggetion是添加新的列(ID
)插入Right_Group
表,并且具有该ID
作为主键。然后分别在其他列上使用外键(IDRight
,IDGroup
)。
**不起作用**不是意外行为的最佳描述。那么如果执行SaveChanges会发生什么?通过附加到数据库,你的意思是你已经将它们加载到_dataContext的同一个实例上? – 2011-02-17 08:34:14
对不起,SaveChanges()完成时,数据不会保存在数据库中。我的意思是,当我发送对象到WCF端时,我分离了我的datacontext的对象,并且它们不再被跟踪。所以当我再次进入我的服务器时,我需要附加这些属性并应用更改 – J4N 2011-02-19 07:31:54