实体框架 - 自动添加未附加的项目

时间:2012-10-15 08:54:29

标签: entity-framework

我使用EF 5和Code First。

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

但是当我尝试将新的TranslationItem(t.TranslationItems.Add)添加到现有的Translation时,它不会保存在DB中。 context.ObjectStateManager.GetObjectStateEntries(EntityState.Added)也没有返回任何元素,所以我猜新翻译项仍然是未附加的。由于在Child Usercontrol中添加了TranslationItem,因此我无法访问当前的Datacontext以将实体状态设置为Added。

我该怎么办?

编辑:

public class Translation : BaseEntity, IValidatableObject
{

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

        }
    }s

在ViewModel中:

Translation = new Translation(); or

Translation = repo.GetTranslation(1);

绑定到自定义Usercontrol:

<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构造函数中创建Context并将其传递给存储库类。

1 个答案:

答案 0 :(得分:1)

如果Translation已正确附加,则ChangeTracker 自动抓取所有孩子。但是,如果您确定TranslationItems附加到上下文,则可以尝试附加Translation内的所有Translation

我不确定DbSet的{​​{1}}名称,将其更改为您为其命名的内容。

TranslationItems