因此,对于实体框架,我试图更新两个现有实体。
我的主要对象是:
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方法可以工作并且还可以更新关系。
答案 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)而不是在它上面工作?