Свободное отображение между существующими и новыми таблицами - PullRequest
0 голосов
/ 17 сентября 2010

Проблема проста. У меня есть два класса, сопоставленные с беглым nhibernate:

public class A: EntityBase {}
public class B: EntityBase
{
   public virtual A A_Something {get;set;}
}

с классом EntityBase, предоставляющим только свойство Key. Теперь я хочу отобразить их и настроить мою базу данных. Итак, вот сопоставления

public class AMap : DomainEntityBase<A>
{
  public AMap(){}
}

public class BMap : DomainEntityBase<B>
{
  public BMap()
  {
    References(p=>p.A_Something).Column("A_ID");
  }
}

и конфигурация дБ

Fluently.Configure().Database(...).Mappings(m =>
  m.FluentMappings.Add<BMap>()).
   ExposeConfiguration(BuildSchema).BuildSessionFactory();

Конфигурирование выполняется только с BMap, так как, к сожалению, таблица A уже существует внутри базы данных, и ее данные нельзя изменить (это потому, что это приложение использует части большей базы данных, и эти части не подлежат изменению). Таким образом, эта схема генерирует стандартное исключение

An association from the table [B] refers to an unmapped class: A

Есть ли возможность как-то указать в моей конфигурации, что A уже существует в БД? Если нет, каковы ваши предложения, чтобы решить эту проблему мягким способом? Конечно, я могу подготовить файлы * .sql для создания таблицы B вручную, но это не решение (просто отодвинуть проблему, поскольку она обязательно вернется в ходе дальнейшей разработки). Также может сработать создание отдельной базы данных и импорт данных из первой, но, к сожалению, существует потребность хранить данные в одной (и только одной) базе данных.

1 Ответ

0 голосов
/ 17 сентября 2010

Вы должны отобразить все объекты, которые вы будете использовать;наличие или отсутствие соответствующих таблиц в базе данных не имеет значения.

Только тогда, когда вы создаете схему, это имеет значение, но все, что вам нужно сделать, это генерировать сценарии обновления вместо создания сценариев.Учитывая диалект базы данных и соединение, NHibernate сгенерирует сценарии для создания отсутствующих таблиц и обновления существующих таблиц, если это необходимо (что, по-видимому, не в данном случае).

Если имя существующей таблицы несоответствует тип объекта (имя по умолчанию), вам нужно указать это в вашем отображении, вызвав:

Table("ATable");
...