【问题标题】:NHibernate: Mapping protected members in component (composite-element) mappingNHibernate:在组件(复合元素)映射中映射受保护的成员
【发布时间】:2017-06-19 17:22:25
【问题描述】:

我正在构建一个通过代码使用 NHibernate 映射的应用程序,当我对值对象的集合使用组件映射(相当于 hbm 复合元素映射)时,我无法映射受保护的属性。

我能够在实体和组件映射中为单个值对象映射受保护的属性,只是在映射值对象的集合时似乎不支持受保护的属性。

public class MyEntity
{
    public virtual int Id { get; protected set; }
    protected virtual MyValueObject MyValueObject { get; set; }
}

public class MyValueObject
{
    protected string SomeString { get; set; }
    protected ISet<NestedValueObject> NestedValueObjects { get; set; }
    // Constructor, Equals/GetHashcode overrides, etc.
}

public class NestedValueObject
{
    public string Name { get; set; }
    protected DateTime CreatedOn { get; set; } // Audit only property
    // Constructor, Equals/GetHashcode overrides, etc.
}

    public MyEntityMap()
    {            
        Table("MyEntityTable");
        Id(x => x.Id, map =>
        {
            map.Column("Id");
        });

        Component<MyValueObject>("MyValueObject", c =>
        {
            // Protected property maps correctly
            c.Property("SomeString", map =>
            {
                map.NotNullable(true);
            });
            c.Set<NestedValueObject>("NestedValueObjects", map =>
            {
                map.Table("NestedValueObjectsTable");
                map.Key(k => k.Column("MyEntityId"));
            }, r => r.Component(n =>
            {
                // Public property maps correctly
                n.Property(x => x.Name);
                // Compilation fail - there is no method that supports protected properties in component mappings
                n.Property<DateTime>("CreatedOn", map =>
                {
                    map.NotNullable(true);
                });
            }));
        });
    }

这是因为IMinimalPlainPropertyContainerMapper&lt;TContainer&gt; 支持受保护的属性,而IComponentElementMapper&lt;TComponent&gt; 不支持。

这是有原因的吗?应该允许值对象具有仅用于审计目的且不构成其概念标识的一部分的受保护属性似乎是合理的,并且单个值对象的组件映射支持受保护属性。

【问题讨论】:

    标签: nhibernate value-objects mapping-by-code


    【解决方案1】:

    看起来这是缺少功能,而不是设计决定,将在 NHibernate 的未来版本中修复:

    https://nhibernate.jira.com/browse/NH-3993

    在此版本之前,作为一种解决方法,替代方法是将属性公开或使用一对多映射将值对象映射为具有复合 id 的实体,因为这些支持受保护的变量。

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      相关资源
      最近更新 更多