【发布时间】: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<TContainer> 支持受保护的属性,而IComponentElementMapper<TComponent> 不支持。
这是有原因的吗?应该允许值对象具有仅用于审计目的且不构成其概念标识的一部分的受保护属性似乎是合理的,并且单个值对象的组件映射支持受保护属性。
【问题讨论】:
标签: nhibernate value-objects mapping-by-code