Entity framework EF POCO&x27;s can';更新导航属性

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) {

我将EF5与MVC和POCO一起使用,需要一些帮助

我有一个更新函数,它被传递给一个断开连接的POCO。POCO有一个“导航属性”集合,例如:提供者有

公共虚拟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)的复合密钥,所以它可能试图在这里添加两次
如果我没有预先添加提供商。我得到的公司:

位于System.Data.Entity.Internal.InternalContext.SaveChanges()的 System.Data.Entity.Internal.LazyInternalContext.SaveChanges()位于 System.Data.Entity.DbContext.SaveChanges()


我只需要测试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对我帮助很大,所以希望我能从这里恢复过来。再次感谢。