EntityFramework 5 CodeFirst Rice родитель одного типа не обновляет / сохранение -- c# поле с участием asp.net-mvc поле с участием ef-code-first поле с участием entity-framework-5 пол Связанный проблема

EntityFramework 5 CodeFirst Child Parent of the Same Type Not Updating/Saving


1
vote

проблема

русский

У меня есть <код> class называется раздел

 <код> public class Section {     public Section() { construct(0); }     public Section(int order) { construct(order); }     private void construct(int order)      {         Children = new List<Section>();         Fields = new List<XfaField>();         Hint = new Hint();         Order = order;     }      [Key]     public int Id { get; set; }      public int FormId { get; set; }      public string Name { get; set; }      [InverseProperty("Parent")]     public List<Section> Children { get; set; }      public List<XfaField> Fields { get; set; }      public Section Parent { get; set; }      public Hint Hint { get; set; }      public int Order { get; private set; }       #region Methods     public void AddNewChild()     {         AddChild(new Section         {             Name = "New Child Section",             FormId = FormId,         });     }     private void AddChild(Section child)     {         child.Parent = this;          if (Children == null) Children = new List<Section>();          int maxOrder = -1;         if(Children.Count() > 0) maxOrder = Children.Max(x => x.Order);          child.Order = ++maxOrder;          Children.Add(child);          FactoryTools.Factory.PdfSections.Add(child);     }     // Other methods here     #endregion }   

Я пытаюсь добавить новый ребенок <код> Section на уже существующий родитель, как это:

 <код>     private void AddChildSection()     {         var parent = FactoryTools.Factory.PdfSections.FirstOrDefault(x => x.Id == ParentId);          if (parent == null) throw new Exception("Unable to create child because parent with Id " + ParentId.ToString() + " doesn't exist.");          parent.AddNewChild();          FactoryTools.Factory.SaveChanges();     }   

Когда я смотрю на базу данных, я вижу, что была добавлена ​​новая строка, поэтому, например:

 <код> Id  Name                Parent_Id   Hint_Id FormId  Order 19  New Child Section   1           27      1       0   

Однако, когда я загружаю родительский <код> Section , <код> Children имущества всегда Count 0, как это:

 <код>     public ActionResult EditSection(int formId, int sectionId)     {         var model = FactoryTools.Factory.PdfSections.FirstOrDefault(x => x.Id == sectionId);          if (model == null || model.FormId != formId) model = new Section();          //model.Children = FactoryTools.Factory.PdfSections.Where(x => x.Parent.Id == sectionId).ToList();          return PartialView(model);     }   

Конечно, когда я вручную добавляю детей, то они есть там (в вышеуказанном коде, не сопротивляя <код> model.Children = ... line)

Я привык к Nibernate способ делать вещи и поэтому совершенно расстроен, что вышеизложенное, казалось бы, простой, задача не работает в EntityFramework, что я делаю не так?

Английский оригинал

I have a class called Section

public class Section {     public Section() { construct(0); }     public Section(int order) { construct(order); }     private void construct(int order)      {         Children = new List<Section>();         Fields = new List<XfaField>();         Hint = new Hint();         Order = order;     }      [Key]     public int Id { get; set; }      public int FormId { get; set; }      public string Name { get; set; }      [InverseProperty("Parent")]     public List<Section> Children { get; set; }      public List<XfaField> Fields { get; set; }      public Section Parent { get; set; }      public Hint Hint { get; set; }      public int Order { get; private set; }       #region Methods     public void AddNewChild()     {         AddChild(new Section         {             Name = "New Child Section",             FormId = FormId,         });     }     private void AddChild(Section child)     {         child.Parent = this;          if (Children == null) Children = new List<Section>();          int maxOrder = -1;         if(Children.Count() > 0) maxOrder = Children.Max(x => x.Order);          child.Order = ++maxOrder;          Children.Add(child);          FactoryTools.Factory.PdfSections.Add(child);     }     // Other methods here     #endregion } 

I am trying to add a new child Section to an already existing parent like this:

    private void AddChildSection()     {         var parent = FactoryTools.Factory.PdfSections.FirstOrDefault(x => x.Id == ParentId);          if (parent == null) throw new Exception("Unable to create child because parent with Id " + ParentId.ToString() + " doesn't exist.");          parent.AddNewChild();          FactoryTools.Factory.SaveChanges();     } 

When I look at the database, I see that a new row has been added, so for example:

Id  Name                Parent_Id   Hint_Id FormId  Order 19  New Child Section   1           27      1       0 

However, when I load the parent Section, the Children property is always of Count 0, like this:

    public ActionResult EditSection(int formId, int sectionId)     {         var model = FactoryTools.Factory.PdfSections.FirstOrDefault(x => x.Id == sectionId);          if (model == null || model.FormId != formId) model = new Section();          //model.Children = FactoryTools.Factory.PdfSections.Where(x => x.Parent.Id == sectionId).ToList();          return PartialView(model);     } 

Of course, when I manually add the children, then they are there (in the above code, by uncommenting the model.Children = ... line)

I am used to the NHibernate way of doing things and am therefore quite frustrated that the above, seemingly simple, task is not working in EntityFramework, what am I doing wrong?

</div
           

Список ответов

2
 
vote
vote
Лучший ответ
 
<Р> Entity Framework не будет охотно загружать связанные объекты. Попробуйте заставить его включить детей:
 <код> var model = FactoryTools.Factory.PdfSections.Include("Children").FirstOrDefault(x => x.Id == sectionId);   
<Р> Там также сильно типизированных от перегрузки, к которому вы можете передать лямбда:
 <код> var model = FactoryTools.Factory.PdfSections.Include(s => s.Children).FirstOrDefault(x => x.Id == sectionId);   
 

Entity Framework won't eagerly load related entities. Try forcing it to include the children:

var model = FactoryTools.Factory.PdfSections.Include("Children").FirstOrDefault(x => x.Id == sectionId); 

There's also a strongly-typed overload to which you can pass a lambda:

var model = FactoryTools.Factory.PdfSections.Include(s => s.Children).FirstOrDefault(x => x.Id == sectionId); 
</div
 
 
   
   

Связанный проблема

-1  Какой поток Nibernate Pure? [закрыто]  ( What is the flow of nhibernate pure ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос должен быть больше Фокусированный . В настоя...

0  C # Исключение, где емкость ниже, чем количество  ( C sharp exception where capacity is lower than count ) 
Я ударю исключение со списком в C #, когда добавляю элемент в списке. Я не могу видеть ничего конкретного там. <Код> tempList.ForEach(tempDis => alloc.ListD...

0  Написание одного символа за раз в приложении консоли C #?  ( Writing one character at a time in a c sharp console application ) 
Я не уверен, как это объяснить ... В основном я хочу иметь возможность писать строки текста в консоли, как старые RPG, используемые для записи диалога, один...

1  Получение строки сразу после вставки возвращается нет результата  ( Getting row right after insert returns no result ) 
Я бегут тесты подразделения, и когда я пытаюсь вставить данные в базу данных и получить его сразу после того, как я ничего не получаю (я пробовал с <код> Data...

0  Создание ссылки IPC между плагинами APC Java и C #  ( Establishing ipc link between a java app and c based plugins ) 
У нас есть приложение Java, а также ряд плагинов C #, для других приложений (например, Excel), которые могут взаимодействовать с основным приложением. Слой св...

1  Visual Studio C # KeyDown блокирует друг друга  ( Visual studio c sharp keydown blocking each other ) 
Есть ли способ сделать два ключа работать одновременно, поэтому они не блокируют друг друга? <код> private void multiplayer_KeyDown(object sender, KeyEv...

8  Почему я не могу удалить это cookie?  ( Why cant i delete this cookie ) 
Хорошо, вот 411 - у меня есть следующий обработчик событий в моем файле Global.Asax.cs: <код> private void Global_PostRequestHandlerExecute(object sender, E...

1  WCF Callback Doblocks даже с «iSineynchronInationContext = False»  ( Wcf callback deadlocks even with usesynchronizationcontext false ) 
Я застрял с проблемой, которую я не могу понять. Проблема связана с синхронизацией между потоками на стороне клиента, но я не могу найти корневую причину эт...

9  DataTable не выпускает память  ( Datatable does not release memory ) 
У меня есть процесс загрузки данных, который загружает большую сумму данных в DataTable, затем выполняет некоторые данные, но каждый раз, когда задание заверш...

0  Получить объект атрибута из inamedtypesymbol.getttributes () I.e. Объект Attribradate?  ( Get attribute object from inamedtypesymbol getattributes i e attributedata ob ) 
Я определил следующий атрибут <код> [AttributeUsage(AttributeTargets.Class)] class DemoAttribute : Attribute { public string SomeInfo { get; } public D...

0  WCF Post Method Получить ошибку 400 плохой запрос  ( Wcf post method get error 400 bad request ) 
Я использую метод WCF Post, как только я добавил PARAMETER POST на службу, его ошибка возврата 400 плохой запрос, если я оставил параметр пустой, он может пол...

1  Как получить доступ к конкретной группе в CollectionSourceSource.View.Groups  ( How to access a specific group within collectionviewsource view groups ) 
У меня есть .NET Имя Свойство. Я хотел бы знать, есть ли способ выбрать определенную подгруппу на достаточно высоком уровне без необходимости оценивать н...

5  Объект к сопоставлению объекта  ( Object to object mapping utility ) 
Мне нравится чисто разделить публику и домен объекты (Итак, nhibernate не поможет здесь) друг от друга, которые заставляют меня писать много кода, чтобы ото...

0  Ресурс кастинга COSMOS БД в интерфейс  ( Cosmos db casting resource to interface ) 
Если я хочу вернуть объект на основе интерфейса в Cosmodb, как бы я это сделал? Мой интерфейс: <код> namespace Test { public interface IPerson { ...

105  Почему C # реализует методы как не виртуальные по умолчанию?  ( Why c sharp implements methods as non virtual by default ) 
В отличие от Java, почему C # методы лечения как не виртуальные функции по умолчанию? Скорее всего, это проблема производительности, а не на других возможных ...




© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.