NHibernate:在组件(复合元素)映射中映射受保护的成员

NHibernate:在组件(复合元素)映射中映射受保护的成员,nhibernate,value-objects,mapping-by-code,Nhibernate,Value Objects,Mapping By Code,我正在构建一个通过代码使用NHibernate映射的应用程序,当我为一组值对象使用组件映射(相当于hbm复合元素映射)时,我无法映射受保护的属性 public class MyEntity { public virtual int Id { get; protected set; } protected virtual MyValueObject MyValueObject { get; set; } } public class MyValueObject { pro

我正在构建一个通过代码使用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);
                });
            }));
        });
    }
我能够在单值对象的实体和组件映射中映射受保护的属性,只是在映射值对象集合时受保护的属性似乎不受支持

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);
                });
            }));
        });
    }
公共类MyEntity
{
公共虚拟整数Id{get;protected set;}
受保护的虚拟MyValueObject MyValueObject{get;set;}
}
公共类MyValueObject
{
受保护字符串SomeString{get;set;}
受保护的ISet NestedValueObjects{get;set;}
//构造函数、Equals/GetHashcode重写等。
}
公共类NestedValueObject
{
公共字符串名称{get;set;}
受保护的DateTime CreatedOn{get;set;}//仅审核属性
//构造函数、Equals/GetHashcode重写等。
}
公共MyEntityMap()
{            
表(“MyEntityTable”);
Id(x=>x.Id,map=>
{
地图栏(“Id”);
});
组件(“MyValueObject”,c=>
{
//正确保护属性映射
c、 属性(“SomeString”,map=>
{
map.NotNullable(true);
});
c、 设置(“NestedValueObjects”,映射=>
{
映射表(“NestedValueObjectsTable”);
map.Key(k=>k.Column(“MyEntityId”);
},r=>r.Component(n=>
{
//公共财产地图是否正确
n、 属性(x=>x.Name);
//编译失败-组件映射中没有支持受保护属性的方法
n、 属性(“CreatedOn”,映射=>
{
map.NotNullable(true);
});
}));
});
}
这是因为
IMinimalPlainPropertyContainerMapper
支持受保护的属性,而
IComponentElementMapper
不支持


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

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

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);
                });
            }));
        });
    }

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