簡體   English   中英

沒有外鍵的FluentNHibernate映射

[英]FluentNHibernate mapping without foreign key

我有這兩節課

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;}
}

我試圖用這個Mapper類映射該類:

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

描述與具有相同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'.

我知道我在mapper構造函數中出錯了。 你們可以幫我解決這個問題嗎? 我不想在表Product中放置字段Description_id。 謝謝

將ProductMap更改為:

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

這告訴nHibernate使用Product實體的“Id”列將Description與Description連接到DescriptionMap中定義為Id的列(也需要設置為“Id”)。 如果您還沒有它我已經創建了一個您還需要的DescriptionMap類:

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

CSL提到的應該有用,但我想補充一點,Column Name實際上是References方法的第二個參數,所以你可以簡單地做到這一點。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM