コンポーネントマッピングを使用するときにNHibernateマッピングを使用するアプリケーションを構築していて、保護されたプロパティをマップできません(hbm composite要素マッピング)を使用します。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);
});
}));
});
}
IComponentElementMapper<TComponent>
はそうではないIMinimalPlainPropertyContainerMapper<TContainer>
は、保護されたプロパティをサポートしているためです。
これには理由がありますか?値オブジェクトには、監査目的でのみ存在し、概念的なアイデンティティーの一部を構成しない保護プロパティがあることが許可され、単一値オブジェクトのコンポーネントマッピングで保護されたプロパティがサポートされることは妥当と思われます。それはむしろ、設計上の決定よりも、機能が不足しています。このように見える、とNHibernateは、将来のリリースで修正されます