Пожалуйста, обратите внимание на следующий код:EF код первого - наследование и отношения
public class SomeEntity
{
public int Id { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
}
public class SomeEntityA : SomeEntity
{
public int Number { get; set; }
}
public class SomeEntityB : SomeEntity
{
public string Text { get; set; }
}
public class User
{
public int Id { get; set; }
public int Username { get; set; }
public virtual ICollection<SomeEntityA> SomeEntitiesA { get; set; }
public virtual ICollection<SomeEntityB> SomeEntitiesB { get; set; }
}
Мой вопрос - есть ли способ, чтобы установить FluentApi сделать отношения, указанные выше работы должным образом? В настоящее время, когда к пользователю добавляется новый объект SomeEntityA, EF создает новую запись в таблице SomeEntities с правильно установленным User_Id FK, однако в SomeEntitesA, который является наследуемой таблицей, есть также свойство FK User_Id - установлено как null, и когда я пытаюсь получить SomeEntitesA коллекция из объекта User - она пуста. Я действительно понимаю, почему это происходит, но я не уверен, есть ли способ исправить это? Единственное решение, которое приходит на ум в этот момент заменить следующий код:
public virtual ICollection<SomeEntityA> SomeEntitiesA { get; set; }
public virtual ICollection<SomeEntityB> SomeEntitiesB { get; set; }
с:
public virtual ICollection<SomeEntity> SomeEntitiesA { get; set; }
public virtual ICollection<SomeEntity> SomeEntitiesB { get; set; }
и настроить FluentApi.
Любые мысли будут высоко оценены.
BTW: вы можете принести решение (последний фрагмент кода) из вашего другого ответа на вопрос здесь. Потому что это реальная альтернатива. Он всегда будет загружать все базовые объекты, хотя и «OfType» затем отфильтровывается в памяти, поэтому есть потенциальная нагрузка на данные. Но с другой стороны, у вас есть «Пользователь» в базовом классе, а не «дублируется» в производных классах, как в моем решении. Во что бы то ни стало интересное решение и стоит рассмотреть! (Я буду повышать :)) – Slauma
thx для подсказки, только что обновил ответ. – ntziolis
Спасибо, я думаю, что я буду придерживаться такого подхода, но я хотел бы узнать больше о его производительности? Даже если я изменяю IEnumerable на тип IQueryable и, например, использовать метод Take(), он все равно будет сначала загружать все эти сущности в память? –