2016-11-23 6 views
0

最初に2つのテーブルをコードで作成します。彼らはそれらの間に1対1の関係を持っています。入れ子になった子をコピーする方法(外来キーで)

public class Bar 
{ 
    public int BarId { get; set; } 
    public string Name { get; set; } 
    public int FooId { get; set; } 
    public virtual Foo Foo { get; set; } 
} 

public class Foo 
{ 
    public int FooId { get; set; } 
    public string Name { get; set; } 
    public virtual List<Bar> Bars { get; set; } 
} 

私はFoo foo1のインスタンスを1つ作成します。これは、Barsのリストを持ちます。次に、私はFoo foo2の別のインスタンスを作成し、すべてのfoo1 Barsを持つようにします。

私はこれを行う場合:

var bar = new Bar { 
    Name = "Bar 1" 
}; 
var bar2 = new Bar 
{ 
    Name = "Bar 2" 
}; 
var foo = new Foo 
{ 
    Name = "Foo 1", 
    Bars = new List<Bar> { bar, bar2 } 
}; 
_db.Foos.Add(foo); 
_db.SaveChanges(); 

var foo2 = new Foo 
{ 
    Name = "Foo 2", 
    Bars = foo.Bars.ToList() 
}; 
_db.Foos.Add(foo2); 
_db.SaveChanges(); 

を次にfoo2はすべてfoo1のバーを持っていますが、foo1のは何もありません。 だから私はこのような何かやっている:

var bars2 = new List<Bar>(); 
foreach (var _bar in foo.Bars) 
{ 
    bars2.Add(new Bar 
    { 
     Name = _bar.Name 
    }); 
} 

var foo2 = new Foo 
{ 
    Name = "Foo 2", 
    Bars = bars2 
}; 

をしかし、それはちょうど私に権利いないようです。これを行うもっとクリーンな方法はありませんか?私はEFがこれを自動的に理解して処理することを約束しました。

+0

c#質問のタグc#を使用します。 Cはまったく別の言語です。 –

+0

@BodoThiesen申し訳ありませんが、間違いでした。 – John

+0

謝罪する必要はありません。 –

答えて

0

私はあなたがちょうどあなたがリストの新しいコピーを取得します。この方法では

. 
. 
var foo2 = new Foo 
{ 
    Name = "Foo 2", 
    Bars = foo.Bars.Select(bar => (Bar)bar.Clone()).ToList(); 
}; 
. 
. 

をfoo2は、それを割り当てる前に、あなたのリストのクローンを作成する必要があると思います。

更新: エンティティを拡張してICloneableを実装します。

public partial class Bar: ICloneable 
{ 
    public object Clone() 
    { 
     var bar = new Bar(); 
     bar.Name = Name; 
     return bar; 
    } 
} 

同じ名前空間の下部分クラスを置くことを忘れてはいけないアップデート2:

あなただけの単純なコピーが必要な場合には、MemberwiseClone()を使用することができます。

. 
. 
public object Clone() 
     { 
      return this.MemberwiseClone(); 
     } 
. 
. 

申し訳ありませんインターフェイスコードを忘れてしまいました。

+0

どのような名前空間にもEFが 'Clone'メソッドを持っていることがわかりませんでした。 – John

関連する問題