2013-06-18 234 views
2

我想我FluentNHibernate映射轉換爲NHibernate的映射關係通過代碼使用NHibernate 3.3.3。目標是升級到NHibernate 3.3.3並減少正在分發的程序集數量。NHibernate的多列多對一映射與映射到碼

然而,當我編譯和運行我得到以下異常:

NHibernate.MappingException:多列屬性不能被通過單列API映射。

XML映射FluentNHibernate得到我這個樣子的:

<many-to-one cascade="none" class="TextDto" fetch="join" lazy="false" name="Name" not-found="ignore"> 
    <column name="NameTextId" unique="false" /> 
    <column name="LanguageId" unique="false" /> 
</many-to-one> 

這是我的新的副代碼映射:

this.ManyToOne(u => u.Name, c => 
{ 
    c.Cascade(Cascade.None); 
    c.Class(typeof(TextDto)); 
    c.Columns(
     x => 
     { 
      x.Name("NameTextId"); 
      x.Unique(false); 
     }, 
     x => 
     { 
      x.Name("LanguageId"); 
      x.Unique(false); 
     }); 
    c.Fetch(FetchKind.Join); 
    c.Lazy(LazyRelation.NoLazy); 
    c.NotFound(NotFoundMode.Ignore); 
    c.Unique(false); 
}); 

這是老FluentNHibernate映射:

References(x => x.Name) 
    .Columns("NameTextId", "LanguageId") 
    .Cascade.None() 
    .Fetch.Join() 
    .NotFound.Ignore() 
    .Not.Unique() 
    .Not.LazyLoad(); 

出於完整性屬性類型invol VED:

public class TextDto 
{ 
    public TextCompositeId Id { get; set; } 
    public string PluralText { get; set; } 
    public string SingularText { get; set; } 
    public override bool Equals(object obj) 
    { 
     var text = (TextDto)obj; 
     if (text == null) return false; 
     return this.Id.Equals(text.Id); 
    } 
    public override int GetHashCode() 
    { 
     return this.Id.GetHashCode(); 
    } 
} 

而在實體的屬性的例子:

public class CharacteristicValue 
{ 
    public CharacteristicValueCompositeId Id { get; set; } 
    public TextDto Name { get; set; } 
    public string LanguageIdentity { get; set; } 
    public string Value 
    { 
     get 
     { 
      string value = null; 
      if (this.ValueMultilingual != null) return this.ValueMultilingual.SingularText; 
      else if (!string.IsNullOrEmpty(this.ValueMeta)) return this.ValueMeta; 
      return value; 
     } 
    } 
    public TextDto ValueMultilingual { get; set; } 
    public string ValueMeta { get; set; } 
    public override bool Equals(object obj) 
    { 
     if (obj == null) return false; 
     if (object.ReferenceEquals(this, obj)) return true; 
     CharacteristicValue characteristicValue = obj as CharacteristicValue; 
     if (characteristicValue == null) return false; 
     if (this.Id != characteristicValue.Id) return false; 
     return true; 
    } 
    public override int GetHashCode() 
    { 
     return this.Id.GetHashCode(); 
    } 
} 

所以,我怎麼獲得XML映射我用來獲取與FluentNHibernate但NHiberbate的映射關係通過碼?

回答

2

在你的映射,從ManyToOne映射刪除c.Unique(false);。我們現在適用於每一列。

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> 

如果你會改變的一列獨特性:

x => 
{ 
    x.Name("NameTextId"); 
    x.Unique(true); // change here 
}, 

唯一性約束將被添加到該列:

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

感謝那些讓我我網元映射編輯。我也觀察到你不能在這裏使用c.NotNullable(false)。 – Wietze

+0

偉大的,如果幫助! ;) –