2013-05-22 39 views
0

FluentNHibernate映射我有這2類不用擔心外鍵

public class Product { 
    public virtual Guid Id {get; set;} 
    public virtual string Name {get; set;} 
    public virtual Description Description {get; set;} 
} 

public class Description { 
    public virtual Guid Id {get; set;} 
    public virtual string Suggestion {get; set;} 
    public virtual string Composition {get; set;} 
} 

我已經嘗試映射此映射類的類:

public class ProductMap : ClassMap<Product> 
{ 
    public ProductMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     References(x => x.Description).ForeignKey("Id"); 
    } 
} 

說明是有關與同一編號的產品,所以例如,Id = 1的產品將在Id = 1的表中進行描述。 現在我嘗試從表中讀取數據:

using (var session = factory.OpenSession()) 
{ 
    var testProduct = session.Query<Product>().Where(p => p.Id == 2).Single(); 
    lblValue.Text = testProduct.Description.Composition; 
} 

,但我得到的錯誤例外

InnerException: System.Data.SqlClient.SqlException 
     Message=Invalid column name 'Description_id'. 

我知道我已經把一些錯誤的映射器的構造。你們能幫我正確地繪製這個圖嗎?我不想將字段Description_id放在表Product中。由於

回答

1

更改ProductMap是這樣的:

public class ProductMap : ClassMap<Product> 
{ 
    public ProductMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 
    References(x => x.Description).Columns("Id"); 
    } 
} 

這告訴NHibernate的加盟產品到使用產品實體定義爲ID在DescriptionMap列的「ID」列說明(這也需要設置爲「Id」)。櫃面你還沒有它,我已經創建了一個DescriptionMap類,你還需要:

public class DescriptionMap : ClassMap<Description> 
{ 
    public DescriptionMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Suggestion); 
    Map(x => x.Composition); 
    } 
} 
1

什麼CSL提到應該工作,但是我想補充的是,列名實際上是參考方法的第二個參數,所以你可以簡單地做到這一點。

public class ProductMap : ClassMap<Product> 
{ 
    public ProductMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 
    References(x => x.Description, "Id"); 
    } 
} 
+0

謝謝,它適用於閱讀。但現在我插入時遇到問題。 –

+0

要修復插入問題,請將兩個類的Id映射更改爲Id(x => x.Id).GeneratedBy.Assigned();這告訴nHibernate應用程序將指定Id,它不會由DB中的Identity列自動生成。 – CSL