Свободный Nhibernate Как указать Id () в SubclassMap - PullRequest
3 голосов
/ 14 января 2010

Я в процессе адаптации Fluent NHibernate к нашему существующему унаследованному приложению и пытаюсь определить, как использовать ClassMap и SubclassMap для показанной иерархии сущностей.

// BaseObject contains database columns common to every table
public class BaseObject
{
    // does NOT contain database id column
    public string CommonDbCol1 { get; set; }
    public string CommonDbCol2 { get; set; }
    // ...
}

public class Entity1 : BaseObject
{
    public int Entity1Id { get; set; }
    // other Entity1 properties
}

public class Entity2 : BaseObject
{
    public int Entity2Id { get; set; }
    // other Entity2 properties
}

Столбцы идентификации для Entity1 и Entity2 имеют уникальные имена для каждой таблицы. BaseObject содержит столбцы, которые являются общими для всех наших объектов. Я не использую AutoMapping, и подумал, что мог бы использовать ClassMap на BaseObject, а затем использовать SubclassMap на каждом объекте, как это:

public class Entity1Map : SubclassMap<Entity1>
{
    public Entity1Map()
    {
        Id(x => x.Entity1Id);
        // ...
    }
}

Проблема в том, что Id () не определен для SubclassMap. Итак, как мне указать в каждом Entity1Map, Entity2Map, ... (у нас есть более 100 классов сущностей, все унаследованных от BaseObject), что такое идентификатор конкретной сущности?

Заранее благодарим вас за понимание!

1 Ответ

8 голосов
/ 14 января 2010

Это невозможно сделать ни в Fluent NHibernate, ни в NHibernate. Вы действительно хотите, чтобы ваши классы отображались как подклассы, или вы просто хотите, чтобы они разделяли общие отображения? Если вы действительно хотите иметь подклассы, то вам нужно, чтобы они разделяли столбец идентификаторов, никак иначе; если вам не нужны фактические подклассы, создайте абстрактный ClassMap<T> where T : BaseObject и отобразите в нем общие свойства.

Что-то вроде:

public abstract class BaseObjectMap<T> : ClassMap<T> where T : BaseObject
{
  public BaseObjectMap()
  {
    Map(x => x.CommonProperty1);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...