Отображение NHibernate на дочерних объектах, которые наследуются от базового класса в отдельном проекте - PullRequest
0 голосов
/ 21 февраля 2012

Мой первый вопрос переполнения стека, здесь идет ...

У меня есть система, которая имеет три базы данных: MyAdminDb , MyAuditDb1 и MyAuditDb2

MyAdminDb имеет таблицу пользователей, которая содержит базовую информацию для пользователей в аудитах 1 и 2. Любая информация о пользователях, относящаяся к любому аудиту, хранится в отдельных таблицах в MyAdminDb , Audit1 и Audit2 соответственно, внешний ключ, привязанный к базовой таблице User с помощью UserId

В моем решении у меня есть следующие проекты

MySystem.Core
MySystem.Core.Data

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

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

У меня есть сущность User в MySystem.Core

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

и свободная карта NHibernate в MySystem.Core.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);
    }
}

В 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, который делает это:

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

Сущность User в вызове GetAll является производной сущностью в проекте 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);
    }

Я использую ключ фабрики сеанса администратора для создания сеансадля MyAdminDb

...