System.InvalidOperationException: пытался добавить свойство «Имя», когда оно уже добавлено. - PullRequest
0 голосов
/ 05 марта 2012

Я действительно изо всех сил пытаюсь получить свой первый проект 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);
    }
}

1 Ответ

0 голосов
/ 06 марта 2012

Я не уверен, что вы должны отобразить Source и Target, используя метод KeyReference(). Я никогда не делал то, что вы пытаетесь сделать здесь, поэтому возьмите то, что я пишу, с крошкой соли.

Обычно я не использую функцию автоматического сопоставления, предпочитая сопоставлять свои объекты вручную. В этих случаях я Map() свойство enum, а FNH использует тип NVARCHAR. Я указываю Length и Not.Nullable().

Итак, основываясь на этом опыте, я бы попытался использовать KeyProperty() или Mapped() и посмотреть, что произойдет. Если не считать этого, поищите в SO проблемы с составным идентификатором, и вы найдете сообщение, в котором говорится об использовании фактического составного класса в качестве идентификатора вместо свойств самого объекта.

Я бы также рассмотрел отображение этого класса вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...