2012-10-15 44 views
1

我使用EF 5和Code First。實體框架 - 自動添加未附加項目

我有一個主ViewModel公開翻譯屬性。翻譯由1到n個翻譯項目組成。翻譯屬性綁定到用戶控件。通過Viewmodel中的_context.Translations.Add(t)創建翻譯並添加時,翻譯內部的所有翻譯項都將被正確保存並保存在數據庫中。

但是,當我嘗試添加一個新的TranslationItem(t.TranslationItems.Add)到現有的翻譯它不保存在數據庫中。 context.ObjectStateManager.GetObjectStateEntries(EntityState.Added)也不返回任何元素,所以我猜新的翻譯項目仍然是未連接的。由於TranslationItem是在Child Usercontrol內部添加的,因此我無法訪問當前的DataContext將實體狀態設置爲已添加。

我該怎麼辦?

編輯:

public class Translation : BaseEntity, IValidatableObject 
{ 

    private List<TranslationItem> _translations; 
     public virtual List<TranslationItem> Translations 
    { 
     get{ 
      return _translations; 
     } 
     set 
     { 
      _translations = value; 

     } 
    }s 

在視圖模型:

Translation = new Translation(); or 

Translation = repo.GetTranslation(1); 

綁定到用戶控件定製:

<Views:TranslationTextInput Translations="{Binding Translation}"/> 

在用戶控件的代碼背後:

   Trans.Translations.Add(new TranslationItem() { Text = "", Lcid = new CultureInfo("en").LCID }); 

保存功能:

public void Update(Translation t) 
    { 
     if (t.Id == 0) 
      _context.Units.Add(t); 
     _context.SaveChanges(); 
    } 

我創建視圖模型構造背景,並將其傳遞到存儲庫類。

+0

你可以發佈你的代碼,你正在使用添加TranslationItem翻譯?我認爲你的問題的根源在於翻譯本身並不獨立 - 你最近如何創建翻譯?如果可以的話,我會從最初創建它時開始附加翻譯。 –

+0

感謝您的評論,請參閱我的編輯。 – TheJoeIaut

+0

當你這樣做時,你的代碼是否工作:Translation = repo.GetTranslation(1);因爲你從上下文獲得現有翻譯?如果是這樣,只需在視圖模型中創建翻譯時將翻譯附加到上下文中,或者創建將立即創建並附加的repo.CreateTranslation –

回答

1

ChangeTracker 應該自動抓住所有的孩子,如果Translation正確連接。但是,如果您確定Translation已連接到上下文,則可以嘗試在Translation內部附加所有TranslationItems

我不確定DbSet名稱爲TranslationItems,請將其更改爲任何您命名的名稱。

public void Update(Translation t) 
{ 
    if (t.Id == 0) 
     _context.Units.Add(t); 

    foreach (var ti in t.Translations) 
    { 
     if (_context.Entry(ti).State == EntityState.Detached) 
     { 
      _context.TranslationItems.Attach(ti); 
     } 
    } 

    _context.SaveChanges(); 
} 
+0

感謝您的大力支持,現在就開始工作吧! – TheJoeIaut