我有这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'.
我知道我在mapper构造函数中出错了。你们可以帮我解决这个问题吗?我不想在表Product中放置字段Description_id。感谢
答案 0 :(得分: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”列将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);
}
}
答案 1 :(得分:1)
CSL提到的内容应该有效,但我想补充一点,Column Name实际上是References方法的第二个参数,所以你可以这样做。
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.Description, "Id");
}
}