NHibernate без какого-либо навязчивого украшения класса? - PullRequest
0 голосов
/ 26 марта 2009

NHibernate не требует слишком большого оформления POCO, но необходимость вставлять суррогатные ключи в мои доменные объекты заставляет меня чувствовать себя немного плохо. Называйте меня чрезмерно усердным - я бы предпочел «идеологически непротиворечивый» - но мои доменные объекты должны обязательно работать с естественными ключами и не должны прибегать к суррогатам.

Я не против использовать суррогаты в моей базе данных, но я не хочу вмешиваться в мою модель рабочего домена. Как мне обойти эту проблему?

Могу ли я подклассифицировать классы домена с помощью составных ключей, адаптируя их так, чтобы NH мог использовать суррогатный ключ, но мой домен не имеет смысла, видя только суперкласс?

class DomainClass
{
     private ParentClass1 _p1; // These two form a composite key
     private ParentClass2 _p2; //
     private int _i;   

     public int SomeProp
     {
         get { return _i; }
     }
}

class NHDomainClass : DomainClass
{
    private long _surrogateKey
    private DomainClass _d;

    public int SomeProp
    {
         get { return  _d.SomeProp; }
    }
}

В этом (поспешном, надуманном) примере NH видит NHDomainClass и может использовать суррогат, но, поскольку он адаптирует DomainClass, он все еще может использоваться как жизнеспособный DomainClass в коде, специфичном для модели. Я вполне уверен, что это сработает, просто хочу убедиться, что я не пропускаю какой-то очевидный более простой метод, который позволит достичь того же результата за долю времени.

Спасибо.

1 Ответ

2 голосов
/ 27 марта 2009

Я не уверен, что вы хотите создать подкласс для ваших обычных объектов домена, просто чтобы добавить суррогатный ключ. В результате вы получите много шума из кода, потому что вам нужно будет использовать имя типа, с которым Nhibernate знаком, вот так.

session.CreateCriteria(typeof(NHDomainClass));

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

...