使用共享外键以一对一的关系映射表?

时间:2011-12-20 11:49:55

标签: fluent-nhibernate

映射以下类的最佳方法是什么?

我有通信是“基础”类的类,因为它包含任一选项的共享数据。只能与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 :(得分:0)

我没有时间写出任何映射,但你需要的是一个鉴别器。这样您就可以说表中有一个CommunicationType外键,可以链接到SmsEmail表。鉴别器的优点在于NHibernate会为您处理一切。

是的,看到你的聚合根是Communication,那么你可以使用一个存储库来访问你的任何一种通信类型。

答案 1 :(得分:0)

确定 我已经通过处理其中一部分的分离的存储库来解决它

我无法正确绑定它,所以选择解决问题。 如果您发现任何方式,请告诉我