Отображение отношения один-к-одному с неверной (коричневой) схемой базы данных - PullRequest
5 голосов
/ 07 декабря 2010

Мне нужно смоделировать эти отношения в NHibernate (немного упростил код, чтобы оставаться в курсе) - сотрудник может быть менеджером по работе с клиентами (так что это необязательно):

таблица Сотрудник (Id, Number, Name) таблица EmployeeIsAccountManager (Number, MaxAllowedDiscount)

вместо того, чтобы иметь внешний ключ Id в таблице EmployeeIsAccountManager, указывающей на таблицу Employee, у меня есть столбец Number в таблице Employee, который указывает на столбец Number в таблице EmployeeIsAccountManager.

Как мне отобразить это в NHibernate? Я попытался использовать внешний генератор в отображении класса EmployeeIsAccountManager, но если я использую Number в качестве внешнего сгенерированного значения, он сопоставляется с идентификатором Employee, который является Id вместо Number. Я смоделировал свой класс, чтобы использовать композицию:

public class Employee
{
   public virtual int Id { get; set; }
   public virtual short Number {get; set; }
   public virtual string Name {get; set; }
   public virtual AccountManager AccountManager { get; set; }
}

public class AccountManager
{
  public virtual short Number { get; set; } /*needed because of ID only?*/
  public virtual decimal MaxAllowedDiscount { get; set }
}   

Я много пробовал (один-к-одному, много-к-одному, чужой генератор), но я не могу понять, можно ли это сделать с помощью NHibernate. Кстати: я могу изменить классы, отображения и т. д., но я НЕ МОГУ изменить структуру таблицы из-за ее статуса в коричневом поле (старое приложение с 2+ миллионами строк кода, почти 1000 форм).

Любая помощь приветствуется, спасибо! Тед

Ответы [ 2 ]

0 голосов
/ 25 ноября 2011
public class Employee
{
    public virtual short Number
    {
       get { return (AccountManager == null) ? 0 : AccountManager.Number; }
       set
       {
           if (AccountManager == null)
               AccountManager = new AccountManager();
           AccountManager.Number = value;
       }
    }
    public virtual AccountManager AccountManager { get; set; }
}

или с GeneratedBy.Assinged ()

public class Employee
{
    public Employee()
    {
        AccountManager = new AccountManager();
    }

    public virtual AccountManager AccountManager
    {
        get;
        set { value.Parent = this; _accountManager = value; }
    }

    public class AccountManager
    {
        Internal protected virtual Employee Parent { get; set; } 

        protected virtual short Number { get { return Parent.Number; } set { } } /*needed because of ID only?*/
        public virtual decimal MaxAllowedDiscount { get; set }
    }
}
0 голосов
/ 28 февраля 2011

Ваш вопрос заставляет меня задуматься о наследовании классов, вы можете сопоставить свой класс AccountManager как подкласс Employee, и тогда вы сможете делать то, что хотите, я тестировал для вас, но когда вы разрабатывали таблицы, которыеспособ не решает ваши потребности, потому что в вашем отображении есть два момента, которые вы должны заметить:

  1. Свойство number в таблице Employee должно быть уникальным ключом первоочередного использования AccountManager, чтобы его можно было использовать.как внешний ключ, но даже в этом случае он не работает, потому что NHibernate, когда вы пытаетесь вставить новый Account Manager, вставит запись в таблицу person, а затем назначит id person для столбца с номерами AccountManager, который вам нужен.,
  2. Отображение этого отношения как многие-к-одному не работает по той же причине.Свойство Number AccountManager является первичным ключом?уникален?NHibernate не может работать без первичных ключей, поэтому для того, чтобы это отношение работало, вы должны указать число номеров AccountManager в качестве столбца Id

Последний вариант, который мне приходит в голову, - это использоватьсвойство в классе Employee, сопоставленное с таблицей AccountManager с формулой, в которой можно указать настраиваемый выбор для получения необходимого значения. Я предполагаю, что свойство MaxAllowedDiscount имеет некоторые ограничения, но при сопоставлении свойства с формулой это свойство не можетвставлять и обновлять.

Надеюсь, это поможет мне понять, если возникнут вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...