我正在尝试让 Fluent NHibernate 1.0 RTM 为我映射一个用户实体,以便我可以通过 NHibernate 访问我的 ASP.NET MVC 应用程序中的 UserId 和 UserName。
我有:
public class User
{
public virtual Guid UserId { get; protected set; }
public virtual string UserName { get; protected set; }
}
它表示仅包含要映射的相关列的 aspnet_Users 表。这是唯一没有被自动映射的实体。这是我的映射:
public class UserMap : ClassMap<User>
{
public UserMap()
{
Id(x => x.UserId);
Map(x => x.UserName);
WithTable("aspnet_Users");
}
}
其他一切都在使用约定进行自动映射。
这是我的 PrimaryKeyConvention 和 TableNameConvention:
public class PrimaryKeyConvention : IIdConvention
{
public void Apply(IIdentityInstance instance)
{
instance.Column(instance.Property.ReflectedType.Name + "Id");
instance.UnsavedValue(System.Guid.Empty.ToString());
instance.GeneratedBy.GuidComb();
}
}
public class TableNameConvention : IClassConvention
{
public void Apply(IClassInstance instance)
{
instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name));
}
}
映射过程在执行 ClassMap 代码(在所有自动映射之前)之后立即失败,然后是 TableNameConvention 代码,然后是 PrimaryKeyConvention 代码。失败出现在 PrimaryKeyConvention 中,因为 instance.Property 为空。我试图做一个 if(instance.Property != null) 但这会提前终止映射过程,并出现“缺少所需的属性‘类’”错误。我在 TableNameConvention 中也有一个 if (instance.EntityType != typeof(User)),但是当它没有任何区别时取出。
这里发生了什么?首先,为什么 AutoMapping 进程调用 ClassMap 的约定?其次,为什么 PrimaryKenConvention 会通过 instance.Property == null?我怎样才能让它工作,以便映射过程继续进行并使用 AutoMapping + 约定映射我的其余实体?
请注意,在重构 1.0 RTM 之前,我已经在早期版本的 FNH 下工作了几个月。