#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.