复杂类型之间的关系未得到更新

时间:2015-05-26 12:07:52

标签: entity-framework

因此,对于实体框架,我试图更新两个现有实体。

我的主要对象是:

public class MainObject
{
     public string Name { get; set; }
     public virtual SmallObject Part { get; set;}
}

public class SmallObject 
{
    public string Name { get; set; }
}

在存储库中,我首先通过以下方式检查数据库中是否已存在SmallObject:

MainObject.Part = (from s in repoSmallObject.GetAll()
            where s.name == MainObject.Part.Name
            select s).FirstOrDefault(); 

然后我最后在我的GenericRepository

中调用了update方法
repoMainObject.Update(MainObject)

定义为通用存储库方法:

dbSet.Attach(entity)
context.Entry(entity).State = EntityState.Modified;

context.SaveChanges();

但这种关系并没有得到更新。这是为什么?两个对象都附加到上下文不?

*编辑:两个repo注入了相同的Context。 奇怪的是,Add方法可以工作并且还可以更新关系。

1 个答案:

答案 0 :(得分:0)

设置
时     context.Entry(entity).State = EntityState.Modified;
您至少需要在更新之后和之前设置状态(即context.Entry(mainObject).CurrentValues和OriginalValues),以便EF可以构建正确的UPDATE查询(使用正确的WHERE子句)。 如果你设置了它,它就有效      context.Entry(entity).State = EntityState.Added;
因为EF只需要生成一个INSERT查询。

我不知道你为什么需要它,但通常我更喜欢将对象附加到DbSet并修改属性,以便EF处理各种状态。

dbSet.Attach(MainObject)
MainObject.Part = (from s in repoSmallObject.GetAll()
            where s.name == MainObject.Part.Name
            select s).FirstOrDefault(); 

(在你的情况下不起作用,因为MainObject.Part.Name不会改变)

附加对象应具有相同的数据库值,否则会出现并发异常。

是的,为什么你不从DB中读取旧对象(MainObject)而不是在它上面工作?