2014-01-21 211 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();