没有外键的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在表产品。由于
把你的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");
}
}