我目前正在开发ASP.NET MVC应用程序,其中有一个User
实体,如下所示:
public class User
{
public virtual int Id { get; protected set; }
public virtual string Name { get; protected set; }
public virtual string Role { get; protected set; }
public virtual Location Location { get; protected set; }
}
位置同样简单:
public class Location
{
public virtual string Id { get; protected set; }
public virtual string Building { get; protected set; }
public virtual string City { get; protected set; }
public virtual string Region { get; protected set; }
}
我的并发症是因为我想从Active Directory而不是数据库填充User
。此外,持久存储到数据库的几个类将用户作为属性引用。我有一个ADUserRepository
用于检索,但我不知道如何将这些用户集成到我的对象图中,其余的由NHibernate管理。
NHibernate是否有办法只保留User
的id而不是Users表的外键?我可以将其映射为组件来完成此操作吗?我还考虑过实施IUserType
来进行翻译。这样它就会映射到一个简单的字段,ADUserRepository
可以放在链中以解析存储的Id。或者我试图破解那些不可行的东西?这是我第一次使用NHibernate,所以我感谢您提供的任何见解或解决方案。感谢。
更新
看来我的最佳解决方案是使用IUserType映射User并注入(最好使用StructureMap)一个服务,用于在返回对象之前填充该对象。从这个角度来看,这里有几个问题涉及主题,主要是需要一个自定义的ByteCodeProvider。我仍然需要这样做,以便IUserType采用参数化构造函数或在此处进行注释:NHibernate.ByteCode.LinFu.dll For NHibernate 3.2有所作为吗?
答案 0 :(得分:0)
使用Usertype将用户转换为id并返回
public class SomeClass
{
public virtual string Id { get; protected set; }
public virtual User User { get; protected set; }
}
// in FluentMapping (you have to translate if you want to use mapping by code)
public SomeClassMap()
{
Map(x => x.User).Column("user_id").CustomType<UserType>();
}
public class UserType : IUserType
{
void NullSafeSet(...)
{
NHibernateUtil.Int32.NullSafeSet(cmd, ((User)value).Id, index);
}
void NullSafeGet(...)
{
int id = (int)NHibernateUtil.Int32.NullSafeGet(cmd, ((User)value).Id, index);
var userrepository = GetItFromSomeWhere();
return userrepository.FindById(id);
}
}