EF不会更新数据库中的导航属性

时间:2014-01-21 09:50:07

标签: entity-framework

我有两个班级:

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

2 个答案:

答案 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();确实有效。 但我没有收到备忘录!