Динамический перевод, чтобы избежать синтаксических ошибок C #
Рассмотрим следующую таблицу базы данных (SQL Server 2005). Я хотел бы использовать это в EF (v6, .net 4.5.1) с функцией Translate, но после поиска кажется, что это не поддерживается.
CREATE TABLE Foo
(
pk INT NOT NULL PRIMARY KEY,
Foo VARCHAR(100)
)
Использование сопоставления по соглашению, которое создаст классFoo
с собственностьюFoo
который не поддерживается синтаксисом C #. Я пытался использоватьColumnAttribute
:
public partial class Foo
{
[Key]
public virtual int pk {get;set;}
[Column("Foo")]
public virtual string Name {get;set;}
}
Кажется, это работает, но я бы хотел, чтобы начальный запрос страницы загружал блоки данных через хранимую процедуру и MARS (и использовал общую структуру, чтобы я мог использовать ее на других страницах), поэтому я вызвал хранимую процедуру и прошел по циклу. наборы результатов, вызовObjectContext.Translate
через отражение (аналогично приведенному ниже, но это сокращенно):
var methTranslate = typeof(ObjectContext).GetMethod("Translate", new[] { typeof(DbDataReader), typeof(string), typeof(MergeOption) });
foreach (var className in classNames)
{
// ...
var translateGenericMethod = methTranslate.MakeGenericMethod(classType);
// ...
reader.NextResult();
var enumerable = (IEnumerable)translateGenericMethod.Invoke(ObjectContext,
new object[] { reader, entitySet.Name, MergeOption.AppendOnly });
}
Отмножественный вещи Я прочитал, сопоставление ColumnAttribute не поддерживается. ОтMSDN:
EF не учитывает сопоставление при создании сущностей с использованием метода Translate. Он просто сопоставит имена столбцов в наборе результатов с именами свойств в ваших классах.
И конечно же, я получаю и ошибку:
Считыватель данных несовместим с указанным «Namespace.Foo». Элемент типа «Имя» не имеет соответствующего столбца в считывателе данных с тем же именем.
Проблема в том, что я не вижу альтернативы или способа указать / намекнуть на отображение. Я мог бы изменить имя класса, но это менее желательно, чем имена свойств.
Любые обходные пути, или любой другой способ динамической загрузки данных без использованияTranslate
?