2016-11-23 3 views
0

Сначала создайте две таблицы с кодом. Они имеют отношение друг к другу между ними.Как скопировать вложенный ребенок (по внешнему ключу)

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, в котором есть список баров. Затем я создаю еще один экземпляр 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

Я думаю, вам просто нужно клонировать список перед назначением его 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; 
    } 
} 

Update 2:

Вы можете использовать MemberwiseClone(), если вам нужно только простую копию.

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

Извините, что забыл про интерфейсный код.

+0

Я не мог найти, что EF будет иметь метод «Клонировать» в любом пространстве имен. – John

Смежные вопросы