2013-12-17 4 views
0

Id 속성을 FluentNHibernate을 사용하여 리플렉션을 통해 내 엔티티 클래스에서 매핑하려고합니다.반사에 의한 매핑 ID 속성

내 엔티티 :

public class BaseMapping<E> : ClassMap<E> 
{ 
    public BaseMapping(string schema, string table) 
    { 
     Schema(schema); 
     Table(table); 
     Id(model => typeof(E).GetProperty("Id", typeof(int)), "Id") 
      .GeneratedBy.Identity() 
      .Not.Nullable(); 
    } 
} 

public class EntityMapping : BaseMapping<Entity> 
{ 
    public EntityMapping() : base("dbo", "Entities") 
    { 
     Map(model => model.Name, "Name") 
      .Length(50) 
      .Insert().Update() 
      .Not.Nullable(); 
    } 
} 

나는이 예외를 수신하고 있습니다 :

{ "신원 유형이 통합 될해야합니다 (

public abstract class BaseEntity 
{ 
    public int Id { get; set; } 
} 

public class Entity : BaseEntity 
{ 
    public string Name { get; set; } 
} 

좋아, 내 매핑 클래스는 위처럼 int, long, uint, ulong) "}

마법처럼 16,

나는 EntityMapping 클래스의 ID 속성을지도 ...

Id(model => model.Id, "Id") 
    .GeneratedBy.Identity() 
    .Not.Nullable(); 

이의 작품. 그러나 첫 시도는 효과가 없습니다.

답변

0

먼저 귀하의 사업자는 귀하의 사업자에 대해 귀하의 부동산을 virtual으로 표시해야합니다. 이것은 NHibernate 프레임 워크가 매직 게으른 로딩 부두를 수행 할 수 있도록하기 위해서입니다.

그렇습니다. 모든 엔티티가 나타나는대로 BaseEntity에서 파생 된 것으로 가정합니다. 이 가정 때문에 typeparam E은 항상 BaseEntity이라는 것을 이해하게 할 수 있습니다.

이렇게하면 BaseMapping<E> 메서드를 다시 작성할 수 있습니다. 당신의 방법에 E의 속성을 노출합니다 where E: BaseEntity을 명시 할함으로써

public class BaseMapping<E> : ClassMap<E> 
    where E: BaseEntity 
{ 
    public BaseMapping(string schema, string table) 
    { 
     Schema(schema); 
     Table(table); 
     Id(model => model.Id, "Id"); 
    } 
} 

. 필자는이 코드를 여러 엔티티 유형을 완성하는 매핑 방법까지 테스트했습니다. 당신이 문

typeof(E).GetProperty("Id", typeof(int))

에게 당신의 메시지를 받았습니다 이유에 관해서는

당신이 memberExpression 매개 변수에 대한 구성원 식을 전달해야 PropertyInfo의 유형을 반환합니다. FluentNHibernate 소스를 파헤어 Expression을 사용하여 반사를 통해 Member으로 평가합니다.