簡體   English   中英

NHibernate / FluentNHibernate只讀CompositeId

[英]NHibernate / FluentNHibernate readonly compositeId

我正在嘗試映射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();
    }
}

更新我嘗試了FluentNHibernate Wiki頁面上的方法,但即使那樣也會產生相同的錯誤。

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中編寫的任何訪問類型映射。

您可以嘗試使用CamelCaseField()訪問:

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

查看有關映射策略的文檔

對於沒有閱讀KeyReference方法的注釋,我感到很傻。

這是compositeId的工作方式:

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

注意訪問設置在KeyReference方法內部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM