NHibernate - несколько типов, реализующих один и тот же интерфейс - PullRequest
1 голос
/ 13 января 2012

Для моего приложения определены следующие типы

public interface IUser {
   int Id { get; set; }
   int UserName { get; set; }
}

public class User : IUser {
   public virtual int Id { get; set; }
   public virtual string UserName { get; set; }
}

Класс User свободно отображается как:

public class UserMap : ClassMap<User> {
    public UserMap() {
        Table("Users");
        Id(x => x.Id);
        Map(x => x.UserName);
    }
}

Я хотел бы создать еще одну реализацию IUser, но у меня есть пара ограничений:

  1. Новые поля должны быть добавлены в ту же таблицу, что и таблица Users
  2. Код для расширения типа существует в отдельном проекте

Например, вот мой новый класс:

public class CustomUser : IUser {
   public virtual int Id { get; set; }
   public virtual string UserName { get; set; }
   public virtual string Name { get; set; }
}

Который отображается как:

public class CustomUserMap : ClassMap<CustomUser> {
    public CustomUserMap() {
        Table("Users");
        Id(x => x.Id);
        Map(x => x.UserName);
        Map(x => x.Name);
    }
}

Первая проблема, с которой я столкнулся, заключалась в том, что ему не нравилось отображать один и тот же интерфейс дважды. Я преодолел это, добавив некоторый код в событие Application_Start, чтобы добавить класс UserMap только в том случае, если класс CustomUserMap не существует.

Однако вскоре я столкнулся с следующей проблемой: если я добавлю ссылку на интерфейс IUser другого типа, он выдаст ошибку:

Ассоциация из таблицы Blogs относится к несопоставленному классу: IUser

Я, вероятно, поступаю совершенно неправильно, и я был бы признателен, если бы кто-то показал мне, что я делаю неправильно. Спасибо

1 Ответ

0 голосов
/ 13 января 2012

Если вы хотите, чтобы они отображались в одну и ту же таблицу, почему вы не наследуете пользователя?Это также будет реализовывать интерфейс IUser.

Чтобы предотвратить дублирование выбора (при выборке пользователя он может получить CustomerUser во втором цикле), вам необходимо указать полиморфизм, явный для класса User.В файлах hbm это будет полиморфизм = "явный", не знаю о беглом nhibernate.

...