다음 데이터베이스 테이블 (SQL Server 2005)을 고려하십시오. 나는이 기능을 EF (v6, .net 4.5.1)에서 번역 기능과 함께 사용하고 싶지만, 검색 후 이것이 지원되지 않는 것처럼 보입니다. C#을 구문에 의해 지원되지 않는 속성 Foo
와 클래스 Foo
을 만들 것동적 C# 구문 오류가 발생하지 않도록하려면
CREATE TABLE Foo
(
pk INT NOT NULL PRIMARY KEY,
Foo VARCHAR(100)
)
사용하여-규칙 매핑. 내가 사용하는 시도 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 });
}
을 multiplethings에서 나는이의 ColumnAttribute 읽었습니다 매핑이 지원되지 않습니다. MSDN에서 :
EF does not take any mapping into account when it creates entities using the Translate method. It will simply match column names in the result set with property names on your classes.
그리고 확실히 충분히, 내가 얻을 오류 :
The data reader is incompatible with the specified 'Namespace.Foo'. A member of the type, 'Name', does not have a corresponding column in the data reader with the same name.
문제는, 내가 매핑에서 어떤 대안이나 지정하는 방법/힌트를 볼 수 없습니다. 클래스 이름을 변경할 수는 있지만 속성 이름보다 바람직하지 않습니다.
또는 Translate
을 사용하지 않고 데이터를 동적으로로드하는 다른 방법?
저장 프로 시저 + 동적 데이터 구조 = [Dapper] (https://github.com/StackExchange/dapper-dot-net)을 읽습니다. –