我在尋找添加兩個實體之間的關聯,並具有一個可設定的ID爲外鍵的方式。我已經搜索了以前的帖子,但最接近的我可以找到一個建議。加載協會 - 這不是我所希望的。我知道這可以在實體框架中使用.HasForeignKey綁定完成,但我似乎無法找到在Fluent NHibernate中執行此操作的方法。功能NHibernate - 映射一個外鍵的屬性
以兩個例子實體:
public class Ticket
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual string ServiceId { get; set; }
public virtual Service Service { get; set; }
}
public class Service
{
public virtual string Id { get; set; }
}
我希望能夠創造票務的新實例,並使用以下手段服務分配給它(假設相關服務表中已經存在):
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
ServiceId = "Microsoft Word 2012"
};
我不想做的是以下幾點:
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
Service = Session.Load<Service>("Microsoft Word 2012")
};
我確實有這個理由,正如我曾經說過的,這可以在實體框架中完成,但是我真的很難理解如何在Fluent NHibernate中實現同樣的事情。我的映射目前看起來像這樣:
public class TicketMapping : ClassMap<Ticket>
{
public TicketMapping()
{
Id(m => m.Id);
Map(m => m.Title).Column("Title");
Map(m => m.ServiceId).Column("ServiceId");
HasOne(m => m.Service).ForeignKey("ServiceId");
Schema("dbo");
Table("Tickets");
}
}
public class ServiceMapping : ClassMap<Service>
{
public ServiceMapping()
{
Id(m => m.Id);
Schema("dbo");
Table("Services");
}
}
任何幫助總是讚賞!
只是一個快速編輯爲周杰倫 - 我不想Session.Load我的元素原因是因爲我不希望我的表現層(MVC 3)關於NHibernate的一無所知 - 因此我使用存儲庫模式並將單個存儲庫注入控制器。因此,例如,我要一個TicketRepository這符合下列合同
public interface IRepository<T>
{
T GetById(object id);
void Create(T entity);
void Update(T entity);
void Delete(T entity);
}
我不希望有注入ServiceRepository也只是爲了獲得到服務參考票務。
您可以詳細說明不希望使用'Session.Load'的有效原因嗎? – Jay 2012-08-14 15:45:54
@Jay,不清楚Terric的原因......但是爲了能夠引用您已經保存的密鑰,恕我直言,加載對象有時候可能會是荒謬的。我們對以前的項目有嚴格的SLA,在它支持FK之前,我們必須在Entity Framework上做同樣的工作。 – 2012-08-14 16:20:36
@Jay已經更新我的帖子的原因。此外,凱文提出了一個很好的觀點,我不希望爲這個關聯加載另一個實體的額外開銷。 – 2012-08-14 16:51:29