C # MVC Entity Framework, идентификатор ребенка, идентификатор внука излишне увеличивается при вызове DataContext.SaveChanges () - PullRequest
0 голосов
/ 03 октября 2018

У меня есть простой дизайн из 3 классов в каркасе сущностей C #:

class Foo{ int id, string name}
class ParentFoo{ int id, Foo foo}
class GrandparentFoo{int id, ParentFoo parentFoo}

Когда я пытаюсь сохранить записи в GrandparentFoo, используя DataContext.SaveChanges (), идентификаторы ParentFoo и Foo увеличиваются, чтоне ожидается.

function AddGrandparent(int g_id, ParentFoo pf){

 using (var dc = dcHelper_.CreateDataContext())
        {
            result = dc.GrandparentFoos.Add(new GrandparentFoo()
            {
                id = g_id,
                parentFoo = pf 
            });

            dc.SaveChanges(); }}

Может кто-нибудь помочь мне с этим вопросом?

1 Ответ

0 голосов
/ 03 октября 2018

ParentFoo и т. Д. Не связаны с вашим контекстом, поэтому контекст будет обрабатывать их как новые объекты.Избегайте передачи сущностей за пределы контекста, в который они загружены, чтобы избежать подобных проблем.Вместо этого, если вы загружаете родительские / дочерние данные, необходимые с идентификаторами, в модели представлений POCO, а затем извлекаете ссылки по мере необходимости, вы можете избежать проблем с несвязанными объектами.

Используя свой код:

void AddGrandparent(int id, ParentFoo pf)
{
  using (var dc = dcHelper_.CreateDataContext())
  {
    var parent = dc.ParentFoos.Find(pf.Id);
    dc.GrandparentFoos.Add(new GrandparentFoo
    {
      Id = id,
      ParentFoo = parent 
    });
    dc.SaveChanges(); 
  }
}

Если GrandParentFoo имеет установленный идентификатор, вы можете отказаться от установки идентификаторов, EF будет игнорировать его при добавлении в контекст.Если parent содержит ссылку на grandparent, вам, возможно, потребуется установить эту ссылку и в ParentFoo.

var grandParent = dc.GrandparentFoos.Add(new GrandparentFoo
{
  Id = id,
  ParentFoo = parent 
});
parent.GrandparentFoo = grandParent;

Edit: если у GrandParent есть коллекция Parent, и вы хотите создать Grandparent и связать его содин существующий родительский элемент:

Сначала убедитесь, что коллекция Parents в GrandParent инициализирована новым списком / HashSet

public virtual ICollection<ParentFoo> ParentFoos {get; set;} = new List<Parent>();

, а затем

 using (var dc = dcHelper_.CreateDataContext())
 {
   var parent = dc.ParentFoos.Find(pf.Id);
   var grandParent = dc.GrandparentFoos.Add(new GrandparentFoo
   {
     Id = id
   });
   grandParent.ParentFoos.Add(parent);
   parent.GrandparentFoo = grandParent;
 }

дочерними элементамиParentFoo не имеет значения, учитывая, что родитель и его связанные дочерние элементы уже существуют в данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...