2012-03-04 48 views
0

私は最初のNHibernateプロジェクトを地面から出そうと苦労しています。私の問題は主にEnumsを中心にしていると思います。私は現在、次の例外を取得しています:System.InvalidOperationException:既に追加されたときにプロパティ 'Name'を追加しようとしました

System.InvalidOperationException: Tried to add property 'Name' when already added. 

私は流暢NHibernateはソースをダウンロードし、例外が発生し、EnumStringTypeとは何かであることを、それを突き止めることができたブレークポイントを設定しています。

は、私は、次のクラスが定義されています:

public class CurrencyStringType : EnumStringType<Currency> 
{ 
} 

そして、次の列挙:

public class ExchangeRate 
{ 
    [Key, Column(Order = 1)] 
    public virtual int JobId { get; set; } 

    [Key, Column(Order = 2), MaxLength(3)] 
    public virtual Currency Source { get; set; } 

    [Key, Column(Order = 3), MaxLength(3)] 
    public virtual Currency Target { get; set; } 

    public virtual decimal Rate { get; set; } 

    public virtual Job Job { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (obj == null) 
      return false; 

     var t = obj as ExchangeRate; 

     if (t == null) 
      return false; 

     if (this.Job == t.Job & this.Source == t.Source && this.Target == t.Target) 
      return true; 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return (this.JobId + "|" + this.Source + "|" + this.Target).GetHashCode(); 
    } 
} 

マッピングの上書きなど:モデルのこの部分で使用されて

public enum Currency 
{ 
    GBP = 826, 
    USD = 840, 
    EUR = 978 
} 

続く:

public void Override(AutoMapping<ExchangeRate> mapping) 
{ 
    // Define the composite key 
    mapping.CompositeId() 
     .KeyProperty(e => e.JobId, "JobId") 
     .KeyReference(e => e.Source) 
     .KeyReference(e => e.Target); 
} 

私はEnumsがFluent NHibernateで動作するように2日以上苦労しています。何らかの理由で非常に複雑に思えます。

アップデートは次のようにそれはしかし、それは単に同じでもEnumStringtypeに属している別のプロパティに置き換えられた最初の例外を克服予想したように、私は

public class CurrencyStringTypeMap : IAutoMappingOverride<CurrencyStringType> 
{ 
    public void Override(AutoMapping<CurrencyStringType> mapping) 
    { 
     mapping.IgnoreProperty(m => m.Name); 
    } 
} 

...新しいマッピングの上書きを作成しましたおそらくどこかにバグがあると思いますか?次のように上記のオーバーライドを追加した後、新たな例外がある:

Tried to add property 'PrimitiveClass' when already added 

私は最終的には、以下の手動マッピングクラスでこれを解決:

/// <summary> 
/// Defines the mapping for ExchangeRates 
/// </summary> 
public class ExchangeRateMap : ClassMap<ExchangeRate> 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="ExchangeRateMap"/> class. 
    /// </summary> 
    public ExchangeRateMap() 
    { 
     Table("ExchangeRates"); 
     CompositeId() 
      .KeyProperty(e => e.JobId, "JobId") 
      .KeyProperty(e => e.Source, "Source") 
      .KeyProperty(e => e.Target, "Target"); 
     Map(e => e.Rate); 
    } 
} 
+0

おそらくマッピングを投稿する必要があります。 –

+0

ありがとう@ColeW - 私はFluent NHibernate AutoMappingを使用していますが、私はオーバーライドを持っており、この詳細で投稿を更新しました。 – ProNotion

答えて

0

私はあなたがSourceをマップする必要があるか分からないし、 TargetKeyReference()メソッドを使用します。私はあなたがここでやろうとしていることは決してやったことがないので、私が塩の穀物で書いたものを取る。

通常、エンティティを手動でマッピングすることをお勧めしますが、自動マッピング機能は使用しません。そのような場合、I Map()はenumプロパティ、FNHはNVARCHARタイプを使用します。私はLengthNot.Nullable()を指定します。

この経験に基づいて、私はKeyProperty()またはMapped()を試してみて、何が起こるかを見てみましょう。そうでない場合、コンポジットIDの問題を探してください。エンティティ自体のプロパティではなく、実際のコンポジットクラスを識別子として使用することについての記事があります。

私はこのクラスを手動でマッピングすることも考えています。

関連する問題