使用实体框架保存对子集合的更改
本文关键字:子集合 保存 实体 框架 | 更新日期: 2023-09-27 18:25:38
我对EntityCollection进行了更改,该EntityCollection是另一个EntityCollection的对象,当我试图保存这些更改时,我会得到以下错误:
EntityCollection已初始化。这个InitializeRelatedCollection方法只应被调用以初始化对象图反序列化期间的新EntityCollection。
你知道我可能错过了什么吗?
以下是我使用的代码。
public void UpdateCompanyManagement(Company newCompany)
{
Company oldCompany = entities.Companies.Where(c => c.COM_ID == newCompany.COM_ID).SingleOrDefault();
oldCompany.Managements = newCompany.Managements;
try
{
entities.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
entities.Refresh(RefreshMode.ClientWins, newCompany.Managements);
entities.SaveChanges();
}
}
我可以使用以下代码成功保存父集合:
public void UpdateCompanyDetails(Company newCompany)
{
Company oldCompany = entities.Companies.Where(c => c.COM_ID == newCompany.COM_ID).SingleOrDefault();
entities.ObjectStateManager.ChangeObjectState(oldCompany.city, System.Data.EntityState.Modified);
oldCompany = newCompany;
try
{
entities.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
entities.Refresh(RefreshMode.ClientWins, oldCompany);
entities.SaveChanges();
}
}
据我所知,您正在有效地尝试更改Management集合中元素的父级。EF很难理解你的意图。
类似的问题也在这里得到了解答。
经过大量研究,我在数据库/模型设置中发现了一个问题(因为我使用的是遗留数据库)。我数据库中的大多数表都没有主键,而那些有主键的表没有标识规范,这导致了问题。所以我修改了数据库并更新了我的模型。
而且,我最终找到了一种简单的方法来编写干净的EF代码。
两个函数中的代码可以重写如下:
public void UpdateCompanyManagement(Company company, int mgmtID)
{
var management = company.Managements.Where(m => m.M_ID == mgmtID).SingleOrDefault();
management.name = "new name";
management.position = "new position";
// edit all you want, then save
// no further code is required
// except you've done something wrong somewhere
try
{
entities.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
entities.Refresh(RefreshMode.ClientWins, company);
entities.SaveChanges();
}
}
以及
public void UpdateCompanyDetails(Company company)
{
company.name = "new company name";
company.address = "new company address";
// edit all you want then save
// no further code is required
// except you've done something wrong somewhere
try
{
entities.SaveChanges();
}
catch (OptimisticConcurrencyException)
{
entities.Refresh(RefreshMode.ClientWins, company);
entities.SaveChanges();
}
}
谢谢,维京人彼得!:)