1

私は EF 5 と Code First を使用しています。

Translation プロパティを公開するメインの ViewModel があります。Translation は、1 ~ n 個の Translation Items から構成されます。Translation プロパティは Usercontrol にバインドされています。Translation が作成され、Viewmodel で _context.Translations.Add(t) を介して追加されると、Translation 内のすべての TranslationItems も保存され、DB に正しく格納されます。

しかし、新しい TranslationItem (t.TranslationItems.Add) を既存の Translation に追加しようとすると、DB に保存されません。context.ObjectStateManager.GetObjectStateEntries(EntityState.Added) も要素を返さないので、新しい翻訳項目がまだ添付されていないと思います。TranslationItem は Child Usercontrol 内に追加されるため、現在の Datacontext にアクセスできません。Entity State を 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 コンストラクターでコンテキストを作成し、それをリポジトリ クラスに渡します。

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 に答える