如何使用NHibernate映射和引用其他数据源中的实体

时间:2012-06-07 23:05:09

标签: nhibernate nhibernate-mapping

我目前正在开发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有所作为吗?

1 个答案:

答案 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);
    }
}