1

我使用 EF 5 和 Code First。

我有一个主要的 ViewModel,它公开了一个翻译属性。翻译由 1 到 n 个翻译项组成。Translation 属性绑定到用户控件。当通过 Viewmodel 中的 _context.Translations.Add(t) 创建和添加翻译时,翻译中的所有 TranslationItems 也会正确保存并存储在数据库中。

但是,当我尝试将新的 TranslationItem (t.TranslationItems.Add) 添加到现有翻译时,它不会保存在数据库中。context.ObjectStateManager.GetObjectStateEntries(EntityState.Added) 也没有返回任何元素,所以我猜新的翻译项仍然没有附加。由于 TranslationItem 添加在子用户控件中,因此我无法访问当前的 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}"/>

在 UserControl 后面的代码中:

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

我在 Viewmodel 构造函数中创建上下文并将其传递给存储库类。

4

1 回答 1

1

如果正确连接,ChangeTracker应该会自动抓取它的所有子项。但是,如果您确定已附加到上下文 ,则Translation可以尝试附加所有TranslationItems内部。TranslationTranslation

我不确定 的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();
}
于 2012-10-15T14:16:09.613 回答