[英]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.