2013-12-17 100 views
0

我试图用我的实体类映射Id属性和反射使用FluentNHibernate由反射映射Id属性

我的实体:

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

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

好吧,我的映射类是像上面:

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(); 
    } 
} 

我收到此异常:

{“身份类型必须是完整的( int,long,uint,ulong)“}

当我地图上EntityMapping类的Id属性...

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

它的作品就像一个魅力。但第一次尝试不起作用。

回答

0

首先,您的物业应标记为virtual为您的实体。这是NHibernate框架可以执行其魔术惰性加载voodoo。

这就是说。让我们假设你所有的实体都从BaseEntity出现。由于这个假设,您可以让typeparam E了解它始终是BaseEntity

一旦你这样做,你可以重写BaseMapping<E>方法。

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

通过specifing where E: BaseEntity会的E属性暴露给你的方法。我只测试了这个代码,直到完成多个实体类型的映射方法。

至于为什么你收到你的信息的声明

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

返回一个类型的PropertyInfo,你需要通过成员表达式为memberExpression参数。通过挖掘FluentNHibernate的源代码,他们使用Expression通过反射评估为Member