C# .Net EF 6.1 Использование базового класса объекта в качестве типа свойства не сопоставляет объект бд

#c# #asp.net #entity-framework #entity-framework-6

Вопрос:

«»У меня есть объект результатов, который я использую для сопоставления запроса, используемого в нескольких таблицах:

 public class Result {  public int Id{ get; set; }   //Value could be bool, int, string, date  public object Value { get; set; } }  

EF Звонит

 results.AddRange(context.Database.SqlQuerylt;Resultgt;("SELECT Id, Value FROM ResultStrings")).ToList()); results.AddRange(context.Database.SqlQuerylt;Resultgt;("SELECT Id, Value FROM ResultInt")).ToList());  

Свойство Id заполняется, но значение остается нулевым. Есть ли способ заполнить свойство Value?

Комментарии:

1. Значением может быть bool, int, строка, дата — как? Какой тип столбца базы данных поддерживает все эти вещи одновременно?

Ответ №1:

Одним словом, «не надо»? 🙂

Вы пытаетесь протолкнуть квадратную сущность EF через отверстие любой возможной формы. Объявите сущности для каждой таблицы результатов. Они могут использовать общий интерфейс и предоставлять «Значение» объекта, если это то, что вы действительно хотите. Попытка втиснуть их все в одну сущность создает дополнительные проблемы, такие как последующее решение вопроса о том, из какой таблицы изначально была получена запись, и потенциальные совпадения идентификаторов. Entity Framework-это сопоставление объектов и реляционных таблиц, которое должно быть взаимно однозначным, чтобы операции могли быть связаны от таблицы к объекту и обратно.

 public abstract class Result {  public int Id { get; set; }  public abstract object Value { get; } }  public class IntResult : Result {  public int RawValue { get; set; }   [NotMapped]  public override object Value =gt; return RawValue; }  public class StringResult : Result {  public string RawValue { get; set; }   [NotMapped]  public object Value =gt; return RawValue; }  

Затем для запроса, к сожалению, если вы хотите, чтобы «Значение» было именем столбца и абстрактным общим именем свойства, вам нужно создать псевдоним результатов. EF не будет учитывать [Column("Value")] атрибуты при использовании SqlQuery .

 results.AddRange(context.Database.SqlQuerylt;StringResultgt;("SELECT Id, Value AS RawValue FROM ResultStrings")).ToList()); results.AddRange(context.Database.SqlQuerylt;IntResultgt;("SELECT Id, Value AS RawValue FROM ResultInt")).ToList());  

В качестве альтернативы, не используйте EF для получения этих результатов. Просто зайдите в базу данных через ADO и запросите данные так, как вы считаете нужным, для заполнения в объект результата POCO.