2016-11-23 37 views
0

採取以下兩個實體: -NHibernate的導航屬性加盟只

public class Product 
{ 
    public virtual int Id { get; set; } 

    public virtual string ItemId { get; set; } 
} 

public class ProductDescription 
{ 
    public virtual int Id { get; set; } 

    public virtual string ItemId { get; set; } 

    public virtual string Description { get; set; } 
} 

這兩個實體由項目Id相關但並不總是存儲針對每一個產品項目Id一個產品描述。

我想要做的是在Product實體中設置一個ProductDescription導航屬性,然後我可以在HQL中使用該屬性,以便像執行其他導航屬性一樣執行連接等。我不希望有一個外鍵或任何強制關係。

在我所做的是爲嘗試如下: -

public class Product 
{ 
    public virtual int Id { get; set; } 

    public virtual string ItemId => ProductDescription?.ItemId; 

    public virtual ProductDescription ProductDescription { get; set; } 
} 

public class ProductMap 
{ 
    public ProductMap() 
    { 
     Id(x => x.Id); 
     References(x => x.ProductDescription).Not.Nullable().Column("ItemId").PropertyRef(x => x.ItemId).ForeignKey("none"); 
    } 
} 

這工作絕對罰款時,從與導航性能工作,我所期望的數據庫讀取現有數據,當談到加入等

我未解決的問題是圍繞產品的持久性問題。當我存儲產品時,我不希望它檢查任何與ProductDescriptions的關係,我只是希望它存儲ItemId,並且如果並且當具有匹配的ItemId的ProductDescription被持久化時,我使用的任何聯接導航屬性應該工作。

我在持續嘗試如下: -

new Product 
{ 
    ProductDescription = new ProductDescription { ItemId = "SomeId" } 
} 

這似乎工作精絕,直到我試圖讓項目Id產品非可空,在這一點上,我得到通常的錯誤你當你還沒有在關係的另一邊設置Inverse()。但是,即使我在反向設置的ProductDescription上創建了HasMany關係,它仍然沒有解決問題。

我希望以上概述我正在嘗試做什麼。我可以使它幾乎完全按照我的想法工作,除非我強制將產品的ItemId設置爲可爲空。

任何想法如何解決這個問題?

回答

0

似乎解決了它。

public class Product 
{ 
    public virtual int Id { get; set; } 

    public virtual string ItemId { get; set; } 

    public virtual ProductDescription ProductDescription { get; protected set; } 
} 

public class ProductMap 
{ 
    public ProductMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.ItemId).Not.Nullable(); 
     References(x => x.ProductDescription).Column("ItemId").PropertyRef(x => x.ItemId).ForeignKey("none").ReadOnly(); 
    } 
} 

這使我可以自由地,無約束地設置關係兩邊的項目ID。導航屬性也按預期工作。