2012-10-15 48 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