如何复制嵌套子(通过外键)

时间:2016-11-23 11:04:07

标签: c# .net entity-framework

首先使用代码创建两个表。他们之间有一对多关系。

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会理解并自动处理这个问题。

1 个答案:

答案 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();
        }
.
.

抱歉,我忘了通过界面代码。