NHibernate映射到从单独项目中的基类继承的子实体

时间:2012-02-21 16:11:52

标签: nhibernate nhibernate-mapping

我的第一个Stack Overflow问题,这里有......

我的系统有三个数据库: MyAdminDb MyAuditDb1 MyAuditDb2

MyAdminDb 有一个User表,其中包含Audits 1& A中用户的基本信息。 2.任何特定于审计的用户信息分别保存在 MyAdminDb Audit1 Audit2 中的单独表中,外键密钥到基本用户表通过UserId

在我的解决方案中,我有以下项目

MySystem.Core
MySystem.Core.Data

MySystem.MyAudit1.Core
MySystem.MyAudit1.Core.Data

MySystem.MyAudit2.Core
MySystem.MyAudit2.Core.Data

我在MySystem.Core中有一个User实体

public class User : KeyedEntity<string>
{
    [StringLength(255)]
    public virtual string DisplayName { get; set; }

    [StringLength(100)]
    public virtual string Forenames { get; set; }

    [StringLength(100)]
    public virtual string Surname { get; set; }

    [StringLength(255)]
    public virtual string EmailAddress { get; set; }

    [StringLength(50)]
    public virtual string Role { get; set; }

    public virtual bool IsAuthorised { get; set; }
}

和MySystem.Core.Data中的流畅NHibernate Map

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id, "UserId")
            .GeneratedBy.Assigned()
            .CustomType("String");

        Map(x => x.DisplayName).CustomType("String");
        Map(x => x.Forenames).CustomType("String");
        Map(x => x.Surname).CustomType("String");
        Map(x => x.EmailAddress).CustomType("String");
        Map(x => x.Role);
        Map(x => x.IsAuthorised);
    }
}

在MySystem.MyAudit1.Core中,我有一个审计特定的User实体,它继承自核心基类,如下所示:

  public class User: MySystem.Core.User
{
    public virtual Trust Trust { get; set; }

    public virtual bool? GeneratedGuid { get; set; }
}

在MySystem.MyAudit1.Data中有自己的映射文件

  public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id, "UserId")
            .GeneratedBy.Assigned()
            .CustomType("String");

        Map(x => x.DisplayName).CustomType("String");
        Map(x => x.Forenames).CustomType("String");
        Map(x => x.Surname).CustomType("String");
        Map(x => x.EmailAddress).CustomType("String");
        Map(x => x.Role);
        Map(x => x.IsAuthorised);
        Map(x => x.GeneratedGuid);
        References(x => x.Trust);
    }
}

我在MyAudit1 MVC区域的Web项目中有一个控制器操作,它执行此操作:

    [HttpGet]
    public virtual ActionResult Index()
    {
        var users = _readRepository.GetAll<User>();

        var listOfUserViewModel = new List<ViewModel>();

        foreach (var user in users)
        {
            var viewModel = new ViewModel();
            ModelToViewModel(user, viewModel, true);
            listOfUserViewModel.Add(viewModel);
        }

        return View(listOfUserViewModel);
     }

GetAll调用中的User实体是MyAudit1项目中的派生实体。使用它不会返回数据库中的任何记录。但是,如果我将User实体从MyAudit1交换到Core项目中的基本实体,则返回表中的所有记录。

 var users = _readRepository.GetAll<Core.User>();

我的问题是,从其他项目的基类派生的类需要以不同的方式映射,以便NHibernate获取数据吗?

编辑: 我在控制器的构造函数中创建会话工厂:

 public UserController(IWindsorContainer iocContainer)
    {
        var sessionFactory = iocContainer.Resolve<ISessionFactory>(Constants.AdminSessionFactoryKey);
        var session = sessionFactory.OpenSession();
        _readRepository = new NHibernateReadRepository(session);
        _unitOfWork = new NHibernateUnitOfWork(session);
    }

我使用Admin Session工厂密钥为MyAdminDb创建会话

0 个答案:

没有答案