Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/nhibernate/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate多列manytone映射和代码映射_Nhibernate_Many To One_Mapping By Code - Fatal编程技术网

NHibernate多列manytone映射和代码映射

NHibernate多列manytone映射和代码映射,nhibernate,many-to-one,mapping-by-code,Nhibernate,Many To One,Mapping By Code,我试图通过使用NHibernate 3.3.3的代码将我的FluentNHibernate映射转换为NHibernate映射。目标是升级到NHibernate 3.3.3,并减少正在分发的程序集数量 但是,当我编译并运行时,会出现以下异常: NHibernate.MappingException:无法通过单列API映射多列属性 XML映射FluentNHibernate获得的结果如下所示: 以下是我的新代码映射: this.manytone(u=>u.Name,c=> { c、 Cascad

我试图通过使用NHibernate 3.3.3的代码将我的FluentNHibernate映射转换为NHibernate映射。目标是升级到NHibernate 3.3.3,并减少正在分发的程序集数量

但是,当我编译并运行时,会出现以下异常:

NHibernate.MappingException:无法通过单列API映射多列属性

XML映射FluentNHibernate获得的结果如下所示:


以下是我的新代码映射:

this.manytone(u=>u.Name,c=>
{
c、 Cascade(Cascade.None);
c、 类别(typeof(TextDto));
c、 纵队(
x=>
{
x、 名称(“NameTextId”);
x、 唯一(假);
},
x=>
{
x、 名称(“语言ID”);
x、 唯一(假);
});
c、 Fetch(FetchKind.Join);
c、 懒惰的(懒散的关系);
c、 NotFound(NotFoundMode.Ignore);
c、 唯一(假);
});
这是旧的FluentNHibernate映射:

引用(x=>x.Name)
.Columns(“NameTextId”、“LanguageId”)
.Cascade.None()
.Fetch.Join()
.NotFound.Ignore()
.Not.Unique()
.Not.LazyLoad();
为确保完整性,所涉及的属性类型:

公共类TextDto
{
public TextCompositeId{get;set;}
公共字符串PluralText{get;set;}
公共字符串文本{get;set;}
公共覆盖布尔等于(对象对象对象)
{
var text=(TextDto)obj;
如果(text==null)返回false;
返回此.Id.Equals(text.Id);
}
公共覆盖int GetHashCode()
{
返回此.Id.GetHashCode();
}
}
以及实体中的财产示例:

公共类特征值
{
public CharacteristicValueCompositeId{get;set;}
public TextDto Name{get;set;}
公共字符串语言标识{get;set;}
公共字符串值
{
得到
{
字符串值=null;
如果(this.ValueMultilingual!=null)返回this.ValueMultilingual.text;
如果(!string.IsNullOrEmpty(this.ValueMeta))返回this.ValueMeta;
返回值;
}
}
public TextDto ValueMultilingual{get;set;}
公共字符串ValueMeta{get;set;}
公共覆盖布尔等于(对象对象对象)
{
if(obj==null)返回false;
if(object.ReferenceEquals(this,obj))返回true;
CharacteristicValue CharacteristicValue=obj作为CharacteristicValue;
if(characteristicValue==null)返回false;
如果(this.Id!=characteristicValue.Id)返回false;
返回true;
}
公共覆盖int GetHashCode()
{
返回此.Id.GetHashCode();
}
}

那么,我如何获得使用FluentNHibernate获得的xml映射,而使用NHiberbate的代码映射呢?

在映射中,删除c.Unique(false)来自
manytone
映射。我们现在对每个列都应用此设置

this.ManyToOne(u => u.Name, c =>
{
    ... // the same as above

    // c.Unique(false); // it is setting now related to columns
});
你会得到的

<many-to-one name="Name" class="TextDto" fetch="join" lazy="false" not-found="ignore">
  <column name="NameTextId" unique="true" />
  <column name="LanguageId" />
</many-to-one>
唯一约束将添加到该列:

<column name="NameTextId" unique="true" />

感谢您为我提供了所需的映射。我还注意到这里也不能使用c.NotNullable(false)。
<column name="NameTextId" unique="true" />