我有两个班级:
public class Foo
{
public Guid Id { get; set; }
public string Subject { get; set; }
public TenderType TenderType { get; set; }
}
和
public class TenderType
{
public Guid Id { get; set; }
public string Name { get; set; }
}
编辑Foo
类时,当我更改TenderType
属性并使用此代码时:
_db.Entry(tender).State = EntityState.Modified;
_db.SaveChanges();
一切似乎都有效,我的上下文将使用新值刷新,但只有Subject
等属性在数据库中已更改!并且TenderType
在数据库中仍然没有变化(不在上下文中)!
即使在调用db.SaveChange()
后如果我在Foo
上执行获取Linq查询,上下文也会返回带有新值的记录!但是在数据库中,TenderType
仍然具有旧值。
这个实体框架的行为是什么?为什么?
我该如何解决这个问题?
(我使用EF 5)。
答案 0 :(得分:0)
我相信你需要告诉EF Include<>()
您的基础对象。 主题的原因是b / c它不是自定义类。 我没有尝试过这个或任何东西,但我认为这是你需要做的。如果这不起作用,请告诉我,我将删除这个错误的答案
var fooEntity = _db.Set<Foo>().Include(o => o.TenderType);
fooEntity.State = EntityState.Modified;
_db.SaveChanges();
由于我经常有很多属性(它们是自定义类),我经常为我的数据库实体创建扩展方法来帮助我解决这个问题,为什么不使用lambda表达式直接使用委托来过滤数据..
public static IQueryable<Foo> AllFoo(this MyDBContext context, Expression<Func<Foo, bool>> predicate = null)
{
if (predicate == null)
predicate = o => o != null;
return context.Foo
.Where(predicate)
.Include(o => o.TenderType);
}
现在......
var fooEntity = _db.AllFoo(o => o.TenderType == TenderTypes.Type1).FirstOrDefault();
fooEntity.TenderType = TenderTypes.Type2;
_db.SaveChanges();
答案 1 :(得分:0)
最后我自己找到了答案。
在_db.SaveChanges();
我执行_db=new Context();
并重新约定值后,_db.SaveChanges();
确实有效。
但我没有收到备忘录!