首页 文章

NHibernate / FluentNHibernate readonly compositeId

提问于
浏览
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'

我所知道的唯一解决方法是制作受保护的 property .

还有另一种解决方法吗?

Update

试过这个,但仍然没有工作:

JournalEntryItemMap.cs

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

Update 我尝试了一种来自FluentNHibernate wiki page的方法,但即使这样也会产生同样的错误 .

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中编写的任何访问类型映射 .

2 回答

  • 1

    您可以尝试使用 CamelCaseField() 访问:

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

    看一下关于映射策略的documentation .

  • 1

    我没有阅读关于KeyReference方法的评论感到愚蠢 .

    以下是它对compositeId的工作原理:

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

    请注意,访问设置在KeyReference方法中 .

相关问题