2014-01-21 34 views
0

导航属性我有两个类:EF不更新数据库

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

你能告诉你如何修改/编辑你的Foo类的实例吗? –

回答

0

终于让我找到我的自己回答。 _db.SaveChanges();之后我做了一个_db=new Context();并重新指定值,然后_db.SaveChanges();确实有效。 但我没有得到备忘录!

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();