0

EntityFrameworkとICollectionの子プロパティを使用してDBデータを更新しようとしています。

また、INSERTの場合、EFは子データを自動的に保存しますが、Updateの場合は保存しません。

手動で更新するようにしましたが、自動更新の方法はわからないのではないかと思います。

私のコードを確認して、アドバイスをください

public class Parent
{
    [Key]
    public int ID {get; set;}   
    public string Name {get; set;}

    public virtual ICollection<Child> Children{ get; set; }
}

public class Child
{
    [Key]
    public int ID {get; set;}
    public int ParentID { get; set; }
    public string Name {get; set;}
}

//INSERTのコントローラーメソッド

public void InsertTest(){
    //generate new Parent Data with child
    Parent parent = new Parent() { 
        Name = "Nancy"
    };

    parent.Children.Add(new Child()
    {
        Name = "First Son"
    });

    parent.Children.Add(new Child()
    {
        Name = "Second Son"
    });

    var parentRepository = unitofwork.parentRepository;
    parentRepository.insert(parent); //context.Set<Parent>().Add(parent);
    unitofwork.Save();
    // it save child entity well
}

//UPDATEのコントローラーメソッド

public void UpateTest()
{
    //generate new Parent Data with child
    Parent parent = new Parent()
    {
        ID = 1,
        Name = "Nancy"
    };

    parent.Children.Add(new Child()
    {
        ID = 1,
        ParentID = 1,
        Name = "First Son Renamed"
    });

    parent.Children.Add(new Child()
    {
        ID = 2,
        ParentID = 1,
        Name = "Second Son"
    });

    // add new data
    parent.Children.Add(new Child()
    {
        Name = "Third Son"
    });

    var parentRepository = unitofwork.parentRepository;
    parentRepository.update(parent); //context.Set<Parent>().Attach(entityToUpdate); context.Entry(entityToUpdate).State = EntityState.Modified;
    unitofwork.Save();
    // it save parent data, but it does not change any for child data

    // *** To make work, I did like this, ***
    // var childRepository = unitofwork.childRepository;
    //foreach (Child c in parent.Children.ToList())
    //{
    //    if (c.ID < 1)
    //    {
    //        childRepository.update(c);
    //    }
    //    else
    //    {
    //        childRepository.insert(c);
    //    }
    //}

    //unitofwork.Save();

    // then it works.
}
4

1 に答える 1

1

選択したものを直接添付してダーティとしてマークしていないため、EFは、データベースから元の値を失うことなく、変更されたことを検出する方法がありません。

データベースから子をロードして値を挿入するか(特に、リストから削除されたものを削除する場合に便利です)、作業単位を使用して、子をアタッチした後に、アタッチ済みを変更済みとしてマークします(ただし、dB操作は少なくなります)。既存の子は削除されません)。

あなたのコードから、update()メソッドはエンティティをダーティとしてマークするメソッドであると思います。

于 2013-02-21T00:28:15.283 に答える