2014-10-17 3 views
0

Я использовал EF (теперь с 6.1.1) в течение соответствующего времени. Но каждый раз, когда мне нужно работать с несколькими объектами внутри контроллера (используя MVC), я теряю себя.Управление сущностью объекта Entity Framework Confusion

Государственное управление сущностями вызывает у меня большое замешательство, и, когда я думаю, что понимаю операцию, возникает еще один сюрприз.

Например (моя текущая путаница):

У меня есть следующие классы:

public class A 
{ 
    public int Id { get; set; } 
    public C c { get; set; } 
} 

public class B 
{ 
    public int Id { get; set; } 
    public C c { get; set; } 
} 

public class C 
{ 
    public int Id { get; set; } 
    public string anotherProperty { get; set; } 
} 

И у меня есть контроллер:

[HttpPost] 
public void CopyEntityAction(A a){ 
    var b = new B() { 
     c = a.c // <== here is the problem 
    }; 
    db.Bs.Add(b); 
} 

То, что я хочу сделать, это скопировать (создать другой объект) C от A до B, а не ссылку на тот же C.Id

Как я могу достичь Это?

Спасибо за ваше время

* Я думаю, что нечто EF может позаботиться автоматически

Edit 1

Я тоже попытался это:

[HttpPost] 
public void CopyEntityAction(A a){ 
    var b = new B(); 

    var c2 = a.c; 
    db.Entry(c2).State = EntityState.Added; 
    b.c = c2; 

    db.Bs.Add(b); 
    db.SaveChanges(); 
} 

ответ

0

Думаю, вам нужно что-то подобное. В противном случае вы имеете дело с одним и тем же точным объектом C, а не с созданием нового.

var b = new B() { 
     c = new C { Id = a.c.Id, anotherProperty = a.c.Anotherproperty } // <== here is the problem 
    }; 

Возможно, вам также потребуется явно добавить новый C в коллекцию C контекста.

+0

Привет, SethMW, спасибо за ваше предложение, но я думаю, что когда вы отмечаете объект с «EntityState.Added», он игнорирует Id и создает новый ... нет? – Oswaldo

+0

Ничего себе, где парень с 3-м ответом, что Mangioned Automapper? Мне тоже понравилось его предложение. Он удалил ответ :( – Oswaldo

+0

AutoMapper помог бы, если бы у вас было много дополнительных свойств для сопоставления при копировании сущностей или их сопоставлении с ViewModels и т. Д. Если у вас действительно есть только пара, это может не стоить накладных расходов. – SethMW

0

Это действительно не все, что сбивает с толку. Это сводится к тому, откуда эти данные. Когда вы извлекаете объект из Entity Framework, он «привязан» к вашему контексту. Тем не менее, когда вы отправили сообщение данных в действие, и у вас есть модельный лозунг нового экземпляра вашей сущности с этими данными (через включение в качестве параметра), это не прилагается. Это означает, что Entity Framework ничего не знает об этом объекте. Он не знает, откуда он, независимо от того, когда-либо он был сохранен раньше или нет (это будет обновление или вставка?) И т. Д. Итак, вам нужно сказать, что делать в этот момент. Это то, что для нумерации EntityState.

+0

Эй, Крис, мой вопрос скорее о копировании объекта с новым идентификатором, а не об отдельных объектах, исходящих из параметра Action. Итак, объект A не имеет отношения ко мне, мне нужно понять, как создать B с C из другого объекта (A в этом примере). Спасибо – Oswaldo

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