简体   繁体   English

NHibernate / FluentNHibernate只读CompositeId

[英]NHibernate / FluentNHibernate readonly compositeId

I'm trying to map 2 entities. 我正在尝试映射2个实体。

JournalEntry.cs JournalEntry.cs

class JournalEntry
{
    private readonly IList<JournalEntryItem> _items;

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

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

JournalEntryItem.cs 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 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();
    }
}

This mapping throws an exception : 此映射引发异常:

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

The only workaround I know of is to make a protected property. 我知道的唯一解决方法是制作一个受保护的属性。

Is there another workaround? 还有其他解决方法吗?

Update 更新

Tried this but still not working: 尝试了这个,但仍然无法正常工作:

JournalEntryItemMap.cs JournalEntryItemMap.cs

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

Update I tried a method from FluentNHibernate wiki page , but even that produces the same error. 更新我尝试了FluentNHibernate Wiki页面上的方法,但即使那样也会产生相同的错误。

JournalEntryItem.cs 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 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();
    }
}

Now I'm getting curious, does it have to do with version issue? 现在我很好奇,这与版本问题有关吗?

I uses NHibernate 3.3.1.4000 and FluentNHibernate 1.4.0.0. 我使用NHibernate 3.3.1.4000和FluentNHibernate 1.4.0.0。

Does FluentNHibernate keep up with NHibernate? FluentNHibernate跟上NHibernate吗? It's almost like NHibernate ignores any access type mapping I wrote in FluentNHibernate. 几乎就像NHibernate忽略了我在FluentNHibernate中编写的任何访问类型映射。

You could try using the CamelCaseField() access: 您可以尝试使用CamelCaseField()访问:

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

Take a look at the documentation about mapping strategies. 查看有关映射策略的文档

I feel silly for not reading through the comments on KeyReference method. 对于没有阅读KeyReference方法的注释,我感到很傻。

Here's how it works for compositeId : 这是compositeId的工作方式:

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

Notice the access setting is inside the KeyReference method. 注意访问设置在KeyReference方法内部。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 (流利)带有CompositeId的NHibernate映射 - (Fluent) NHibernate mapping with CompositeId 如何从FluentNhibernate中从具有2 cols CompositeId的类中引用具有2 cols CompositeId的类? - How to reference a class with 2 cols CompositeId from a class with 2 cols CompositeId in FluentNhibernate? NHibernate Fluent CompositeId与CustomType映射 - NHibernate Fluent CompositeId with CustomType mapping 如何使用Fluent NHibernate映射CompositeId的引用 - How to map a reference of a CompositeId using Fluent NHibernate 流利的NHibernate CompositeId尝试插入空值 - Fluent NHibernate CompositeId trying to insert null values 在Fluent NHibernate中使用CompositeId / Composite键混淆 - Confusion using CompositeId / Composite Keys in Fluent NHibernate 使用 NHibernate 和 FluentNHibernate 创建数据库和表? - Create Database and Tables with NHibernate and FluentNHibernate? 流利的NHibernate映射帮助使用CompositeID引用静态视图 - Fluent NHibernate Mapping Help static view referencing with compositeID 如何在NHibernate的CompositeId映射中设置Column - How can i set a Column in a CompositeId mapping with NHibernate 尝试创建NHibernate和FluentNHibernate连接MySQL吗? - Trying create a NHibernate and FluentNHibernate to connect MySQL?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM