Отображение таблиц с общим внешним ключом в отношении один к одному? - PullRequest
0 голосов
/ 20 декабря 2011

Каков наилучший способ сопоставить следующие классы?

У меня есть классы, где связь является "базовым" классом, так как он содержит общие данные для любого варианта.Там может быть только связь с ComSms или ComEmail.Проблема в том, что я не уверен, как продолжить отображение.Я хотел бы, если вообще возможно использовать один репозиторий для доступа к объектам.

Настройка класса

public interface ICommunication
    {

    }

public Communication: ICommunication{
   //PK and FK on this item
   public virtual int CommunicationId{get;set;}  
   public virtual string Name {get;set;}
   public virtual string Surname {get;set;}
   public virtual DateTime Date{get;set;}

   //I am expecting to switch on type between ComSms and ComEmail
   public virtual Type {get;set;}     

}

public ComSms : Communication{
   public virtual string Number {get;set;}
   public virtual string Text {get;set;}
}
public ComEmail : Communication{
   public virtual string Subject{get;set;}
   public virtual string Body {get;set;}
   public virtual string Address {get;set;}
}

База данных

Simplified Database layout

Воображаемое использование

ICommunication smsToSave = new ComSms()
smsToSave.Name = "UserName";
smsToSave.Surname ="UserSurname";
smsToSave.Date = DateTime.Now;
smsToSave.Type = 1;
smsToSave.Number ="123456789";
smsToSave.Text = "Hello boys";
CommunicationRepository.Save(smsToSave)

Ответы [ 2 ]

0 голосов
/ 05 февраля 2012

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

Я не мог связать его правильно, поэтому решил обойти проблему.если вы найдете способ сделать это, пожалуйста, дайте мне знать

0 голосов
/ 20 декабря 2011

У меня нет времени выписывать какие-либо сопоставления, но вам нужен дискриминатор. Это позволит вам сказать, что в вашей таблице есть внешний ключ CommunicationType, который может ссылаться на таблицу Sms или Email. Хорошая особенность дискриминаторов в том, что NHibernate позаботится обо всем за вас.

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

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