0

我有这 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;}
}

我尝试使用此 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'.

我知道我在映射器构造函数中出错了。你们能帮我如何正确映射它。我不想将字段 Description_id 放在表产品中。谢谢

4

2 回答 2

1

将您的 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”列将 Products 与 Description 连接到 DescriptionMap 中定义为 Id 的列(也需要设置为“Id”)。如果您还没有它,我已经创建了一个您还需要的 DescriptionMap 类:

public class DescriptionMap : ClassMap<Description>
{
  public DescriptionMap ()
  {
    Id(x => x.Id);
    Map(x => x.Suggestion);
    Map(x => x.Composition);
  }
}
于 2013-05-22T13:28:31.910 回答
1

CSL 提到的应该可以,但我要补充一点,列名实际上是 References 方法的第二个参数,所以你可以简单地这样做。

public class ProductMap : ClassMap<Product>
{
  public ProductMap()
  {
    Id(x => x.Id);
    Map(x => x.Name);
    References(x => x.Description, "Id");
  }
}
于 2013-05-22T13:53:12.427 回答