首先使用代码创建两个表。他们之间有一对多关系。
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实例,它有一个Bars列表。然后我创建另一个Foo foo2的实例,我希望它拥有所有foo1条。
如果我这样做:
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 :(得分:0)
我认为您只需克隆列表,然后再将其分配给foo2
.
.
var foo2 = new Foo
{
Name = "Foo 2",
Bars = foo.Bars.Select(bar => (Bar)bar.Clone()).ToList();
};
.
.
通过这种方式,您将获得列表的新副本。
<强>更新强> 扩展您的实体以实现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();
}
.
.
抱歉,我忘了通过界面代码。