具有复合实体的代码manytone的NHibernate映射

具有复合实体的代码manytone的NHibernate映射,nhibernate,many-to-one,mapping-by-code,Nhibernate,Many To One,Mapping By Code,我试图通过使用NHibernate 3.3.3的代码将我的FluentNHibernate映射转换为NHibernate映射。目标是升级到NHibernate 3.3.3,并减少正在分发的程序集数量。我在将FluentNHibernate的引用映射转换为多对一映射时遇到了一些问题 我的许多实体都有需要翻译的描述。为此,我使用一个文本表,其中包含所有可用语言的文本。我使用文本ID引用文本表,然后在数据访问对象中过滤所需的语言。这项工作使用NHibernate 3.1和FluentNHibernat

我试图通过使用NHibernate 3.3.3的代码将我的FluentNHibernate映射转换为NHibernate映射。目标是升级到NHibernate 3.3.3,并减少正在分发的程序集数量。我在将FluentNHibernate的引用映射转换为多对一映射时遇到了一些问题

我的许多实体都有需要翻译的描述。为此,我使用一个文本表,其中包含所有可用语言的文本。我使用文本ID引用文本表,然后在数据访问对象中过滤所需的语言。这项工作使用NHibernate 3.1和FluentNHibernate创建,NHibernate 3.3.3和代码映射,但是我只是一个映射异常,它说:属性映射的列数错误:类别。描述类型:文本

我的新映射哪里错了?或者这种类型的映射在NHibernate 3.3.3中不可能

这是文本表(SQLServer2008)

创建表格文本(
ID int不为空,
languageID nvarchar(10)不为空,
单个nvarchar(最大值)不为空,
复数nvarchar(最大)空,
约束PK_文本主键聚集(ID ASC,languageID ASC)
带(PAD_索引=关闭,
统计信息\u NORECOMPUTE=OFF,
忽略重复键=关闭,
允许\u行\u锁=打开,
允许[PRIMARY]上的[PAGE\u LOCKS=ON])在[PRIMARY]上
文本类:

公共类文本
{
公共文本(int-id、字符串语言、字符串单数、字符串复数)
{
this.ID=新文本复合ID(ID,语言);
这个。单数=单数;
这个。复数=复数;
}
public TextCompositeID{get;private set;}
公共字符串复数{get;private set;}
公共字符串单数{get;set;}
公共覆盖布尔等于(对象对象对象)
{
var text=(text)obj;
if(text==null)
{
返回false;
}
返回此.ID.Equals(text.ID);
}
公共覆盖int GetHashCode()
{
返回此.ID.GetHashCode();
}
}
以下是Category类的示例:

公共类类别
{
公共int ID{get;set;}
公共文本描述{get;set;}
}
Category类的FluentNHibernate xml映射如下所示:


这是由此产生的:

公共类类别映射:类映射
{
公共类别映射()
{
本表(“类别”);
不是。懒汉();
其中(“Isobsolite=0”);
Id(x=>x.Id)
.栏(“ID”)
.GeneratedBy.Native()
.Not.Nullable();
参考(x=>x.Description)
.列(“说明ID”)
.Cascade.None()
.Not.Unique()
.Not.Nullable();
}
}
这是我创建的NHibernate类映射:

公共类别映射()
{
这个。懒惰(假);
这是可变的(真的);
本表(“类别”);
其中(“Isobsolite=0”);
这是我的身份证(
x=>x.ID,
地图=>
{
地图栏(“ID”);
map.Generator(Generators.Native);
});
这是我的手机(
x=>x.说明,
地图=>
{
map.Cascade(Cascade.None);
地图类(文本类型);
映射列(“TextID”);
map.Fetch(FetchKind.Join);
Lazy(LazyRelation.NoLazy);
地图外键(“无”);
});
}
由此,我得到了以下xml映射:


我自己找到了答案。我必须从文本类中删除复合ID:

公共类文本
{
公共文本(int-id、字符串语言、字符串单数、字符串复数)
{
this.ID=ID;
this.LanguageID=语言;
这个。单数=单数;
这个。复数=复数;
}
public int ID{get;private set;}
公共字符串语言ID{get;private set;}
公共字符串复数{get;private set;}
公共字符串单数{get;set;}
公共覆盖布尔等于(对象对象对象)
{
var text=(text)obj;
if(text==null)
{
返回false;
}
返回此.ID.Equals(text.ID);
}
公共覆盖int GetHashCode()
{
返回此.ID.GetHashCode();
}
}
类别映射已成为:

公共类别映射()
{
这个。懒惰(假);
这是可变的(真的);
本表(“类别”);
其中(“Isobsolite=0”);
这是我的身份证(
x=>x.ID,
地图=>
{
地图栏(“ID”);
map.Generator(Generators.Native);
});
这是我的手机(
x=>x.说明,
地图=>
{
映射列(“TextID”);
map.Fetch(FetchKind.Join);
地图外键(“无”);
Lazy(LazyRelation.NoLazy);
});
}
在数据访问对象中,旧的QueryOver查询现在可以得到所需的结果