私は最初の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);
}
}
おそらくマッピングを投稿する必要があります。 –
ありがとう@ColeW - 私はFluent NHibernate AutoMappingを使用していますが、私はオーバーライドを持っており、この詳細で投稿を更新しました。 – ProNotion