没有外键的FluentNHibernate映射

本文关键字:FluentNHibernate 映射 | 更新日期: 2023-09-27 18:14:41

我有2个class

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

Description与具有相同Id的Product相关,因此例如Id = 1的Product将在Id = 1的表中具有Description。现在我试着从表中读取数据:

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构造函数中放错了什么。你们能帮我正确地绘制这个地图吗?我不想把字段Description_id在表产品。由于

没有外键的FluentNHibernate映射

把你的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"列和DescriptionMap中定义为Id的列(也需要设置为"Id")将Products连接到Description。如果你还没有它,我已经创建了一个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");
  }
}
相关文章:
  • 没有找到相关文章