NHibernate / FluentNHibernate только для чтения композитный идентификатор

1

Я пытаюсь отобразить 2 объекта.

JournalEntry.cs

class JournalEntry
{
    private readonly IList<JournalEntryItem> _items;

    public JournalEntry()
    {
        _items = new List<JournalEntryItem>();
    }

    public IList<JournalEntryItem> Items
    {
        get { return _items; }
    }
}

JournalEntryItem.cs

class JournalEntryItem
{
    private readonly JournalEntry _journalEntry;
    private readonly Account _account;

    public JournalEntryItem(JournalEntry journalEntry, Account account)
    {
        _journalEntry = journalEntry;
        _account = account;
    }

    public JournalEntry JournalEntry
    {
        get { return _journalEntry; }
    }

    public Account Account
    {
        get { return _account; }
    }
}

JournalEntryItemMap.cs

class JournalEntryItemMap : ClassMap<JournalEntryItem>
{
    public JournalEntryItem()
    {
        CompositeId()
            .KeyReference(x => x.JournalEntry).Access.Field()
            .KeyReference(x => x.Account).Access.Field();

        // Tried this too, obviously won't work anyway
        // CompositeId()
        //    .KeyReference(x => x.JournalEntry).ReadOnly()
        //    .KeyReference(x => x.Account).ReadOnly();
    }
}

Это сопоставление выдает исключение:

Could not find a setter for property 'JournalEntry' in class Macsauto.Domain.Accounting.Entities.JournalEntryItem'

Единственным обходным решением, которое я знаю, является создание защищенного свойства.

Есть ли другой способ?

Обновить

Пробовал это, но все еще не работал:

JournalEntryItemMap.cs

class JournalEntryItemMap : ClassMap<JournalEntryItem>
{
    public JournalEntryItem()
    {
        CompositeId()
            .KeyReference(Reveal.Member<JournalEntryItem, JournalEntry>("_journalEntry")).Access.Field()
            .KeyReference(x => x.Account).Access.Field();
    }
}

Обновление. Я попробовал метод на странице Wiki FluentNHibernate, но даже это приводит к той же ошибке.

JournalEntryItem.cs

class JournalEntryItem
{
    // Removed the _ prefix just to make it even more similar with
    // those on FluentNHibernate wiki page
    private readonly JournalEntry journalEntry;

    public JournalEntryItem(JournalEntry journalEntry)
    {
        this.journalEntry = journalEntry;
    }

    public JournalEntry JournalEntry
    {
        get { return journalEntry; }
    }
}

JournalEntryItemMap.cs

class JournalEntryItemMap : ClassMap<JournalEntryItem>
{
    public JournalEntryItem()
    {
        CompositeId().KeyReference(x => x.JournalEntry).Access.CamelCaseField();

        // Other tried combinations, all throws same no setter error
        // CompositeId().KeyReference(x => x.JournalEntry).Access.ReadOnlyPropertyThroughCamelCaseField();
        // CompositeId().KeyReference(x => x.JournalEntry).Access.LowerCaseField();
    }
}

Теперь мне становится любопытно, это связано с проблемой версии?

Я использую NHibernate 3.3.1.4000 и FluentNHibernate 1.4.0.0.

Поддерживает ли FluentNHibernate работу с NHibernate? Это почти так же, как NHibernate игнорирует любое сопоставление типов доступа, которое я написал в FluentNHibernate.

Теги:
nhibernate
fluent-nhibernate
fluent-nhibernate-mapping

2 ответа

1
Лучший ответ

Вы можете попробовать использовать доступ к CamelCaseField():

CompositeId().KeyReference(x => x.JournalEntry).Access.CamelCaseField()
             .KeyReference(x => x.Account).Access.CamelCaseField();

Взгляните на документацию о стратегиях сопоставления.

  • 0
    Привет, пожалуйста, смотрите мое обновление.
  • 0
    У вас нет пустого конструктора? NHibernate нужен пустой конструктор для работы ваших сущностей. Попробуйте добавить public или protected пустой конструктор.
Показать ещё 1 комментарий
1

Мне неловко за то, что я не читал комментарии по методу KeyReference.

Здесь, как это работает для compositeId:

public class JournalEntryItemMap : ClassMap<JournalEntryItem>
{
    public JournalEntryItemMap()
    {
        CompositeId()
            .KeyReference(x => x.JournalEntry, map => map.Access.CamelCaseField(Prefix.Underscore));
    }
}

Обратите внимание, что параметр доступа находится внутри метода KeyReference.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню