Я действительно изо всех сил пытаюсь получить свой первый проект NHibernate, я думаю, что мои проблемы вращаются в основном вокруг Enums. В настоящее время я получаю следующее исключение:
System.InvalidOperationException: Tried to add property 'Name' when already added.
Я скачал исходный код Fluent NHibernate и установил точку останова, где происходит исключение, и смог зафиксировать его, чтобы иметь какое-то отношение к EnumStringType.
У меня определен следующий класс:
public class CurrencyStringType : EnumStringType<Currency>
{
}
и следующий перечень:
public enum Currency
{
GBP = 826,
USD = 840,
EUR = 978
}
Что используется этой частью модели:
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 void Override(AutoMapping<ExchangeRate> mapping)
{
// Define the composite key
mapping.CompositeId()
.KeyProperty(e => e.JobId, "JobId")
.KeyReference(e => e.Source)
.KeyReference(e => e.Target);
}
Я уже более 2 дней пытаюсь заставить свои Enums работать с Fluent NHibernate - по некоторым причинам это кажется безумно сложным.
Обновление: я создал новое переопределение отображения следующим образом ...
public class CurrencyStringTypeMap : IAutoMappingOverride<CurrencyStringType>
{
public void Override(AutoMapping<CurrencyStringType> mapping)
{
mapping.IgnoreProperty(m => m.Name);
}
}
Как и ожидалось, он преодолевает первоначальное исключение, однако его просто заменяют тем же, но для другого свойства, которое также принадлежит EnumStringtype, что заставляет меня думать, что, возможно, где-то есть ошибка? Новое исключение после добавления вышеуказанного переопределения выглядит следующим образом:
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);
}
}