Entity framework EF POCO&x27;s can';更新导航属性
我将EF5与MVC和POCO一起使用,需要一些帮助 我有一个更新函数,它被传递给一个断开连接的POCO。POCO有一个“导航属性”集合,例如:提供者有Entity framework EF POCO&x27;s can';更新导航属性,entity-framework,Entity Framework,我将EF5与MVC和POCO一起使用,需要一些帮助 我有一个更新函数,它被传递给一个断开连接的POCO。POCO有一个“导航属性”集合,例如:提供者有 公共虚拟ICollection公司{get;set;} 加载提供程序时(旧上下文关闭),它有两个公司对象,现在有四个,我想更新 我原以为下面的代码可以工作,但公司没有更新(但提供者的非导航属性(如字符串名称{get;set}仍在更新确定),并且没有错误 public void Update(Provider entity) {
公共虚拟ICollection公司{get;set;}
加载提供程序时(旧上下文关闭),它有两个公司对象,现在有四个,我想更新
我原以为下面的代码可以工作,但公司没有更新(但提供者的非导航属性(如字符串名称{get;set}仍在更新确定),并且没有错误
public void Update(Provider entity)
{
// Existing entity
_context.Entry(entity).State = EntityState.Modified;
if (entity.Companies.Any())
{
//try to tell EF about the companies
foreach (var company in entity.Companies)
{
//the company exists already - let the context know....
_context.Entry(company).State = EntityState.Modified;
_context.Companies.Attach(company);
}
}
}
…及更高版本:\u unitOfWork.SaveChanges();
对于我成功使用的公司的供应商插入:
if (entity.Companies.Any())
{
//these are not to be created - they exist -
//I want EF to add them as nav properties
foreach (var company in entity.Companies)
{
//the company exists already - let the context know....
_pvpContext.Companies.Attach(company);
}
}
// New entity
_pvpContext.Entry(entity).State = EntityState.Added;
我要去读朱莉娅·勒曼的书,因为EF要杀了我——但在此期间,我真的非常感谢任何帮助更新“公司”——Thx
编辑:
接受@Manos的善意建议,我尝试:
List<Company> companies = new List<Company>();
if (entity.Companies != null && entity.Companies.Any())
{
//pull out the Companies from the POCO
companies = entity.Companies.ToList();
//remove them
entity.Companies = new Collection<Company>();
entity.Companies.Clear();
}
// pass existing entity to the context, tagged as modified
_pvpContext.Entry(entity).State = EntityState.Modified;
if (companies.Any())
{
//now re-add the companies while the context is listening. ffs.
foreach (var company in companies)
{
entity.Companies.Add(company);
}
}
上市公司=新上市公司();
if(entity.companys!=null&&entity.companys.Any())
{
//从POCO中撤出这些公司
公司=实体.companys.ToList();
//移除它们
实体.公司=新集合();
entity.companys.Clear();
}
//将现有实体传递到上下文,标记为“已修改”
_pvpContext.Entry(entity).State=EntityState.Modified;
if(companys.Any())
{
//现在,在上下文侦听时重新添加公司。ffs。
foreach(公司中的var公司)
{
实体。公司。添加(公司);
}
}
如果我将Provider.companys添加到上下文中(如插入中),我会得到:
违反主键约束“PK_utmp_ms_x_uu679519B7F943FD8D”。
无法在对象“dbo.ProviderCompany”中插入重复的密钥。该
重复键值为(5,3)
- 这很奇怪,因为没有(提供者5,公司3)的复合密钥,所以它可能试图在这里添加两次
我只需要测试4.1,但请尝试将其作为基本逻辑:
public void Update(Provider entity)
{
// Existing entity
Provider contextProvider = _context.Entry(entity);
contextProvider.Companies.Clear();
foreach (var company in entity.Companies)
{
contextProvider.Companies.Add(company);
}
}
这需要一点改进,以便只增加新的公司,而不是进行完全的搬迁和恢复,但它应该会起作用
编辑以回应评论:
尝试捕获SaveChanges()引发的异常,并执行以下操作:
try {
_unitOfWork.SaveChanges();
} catch (System.Data.Entity.Validation.DbEntityValidationException e) {
foreach (var k in e.EntityValidationErrors) {
foreach (var e1 in k.ValidationErrors) {
Console.WriteLine("{0} - {1}", e1.PropertyName, e1.ErrorMessage);
}
}
}
它应该会为您提供更多的信息。谢谢Manos,不幸的是,在我的_unitOfWork.SaveChanges()之后,我遇到了一个奇怪的异常:“在System.Data.Entity.Internal.InternalContext.SaveChanges()在System.Data.Entity.Internal.LazyInternalContext.SaveChanges()在System.Data.Entity.DbContext.SaveChanges()中”异常是否有消息?是的,一个或多个实体的“{”验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。“}System.exception{System.Data.Entity.Validation.DbEntityValidationException}”。我不知道在哪里可以找到EntityValidationErrors:(“谢谢,这真的很有帮助-错误与我为公司使用存根实体有关,例如:公司没有完全水合-它只包括实体键(我认为这是现有对象所需的全部).我最终重新设计了我所拥有的,现在它可以工作了,这主要要感谢你的帮助。我希望EF在没有完全理解的情况下使用起来是直观的,但事实并非如此。从积极的一面来看,Julia Lermans的DbContext book对我帮助很大,所以希望我能从这里恢复过来。再次感谢。