典型的な問題 - 親 ID を格納するための参照列を持つすべての子オブジェクトのネストされた新しい IEnumerable を使用して新しい親オブジェクトを保存しようとしていますが、子オブジェクトを保存するように NHibernate を適切に構成できません。
保存されない理由は、親テーブルのレコード ID を参照する子テーブルの列が null を許可しないように設定されているためです。しかし、NHibernate が親レコード ID を生成し、それを子レコード参照列に提供できるようにする、HasMany の正しい設定を理解できません。
したがって、「列に NULL を挿入できません.....」というエラーが発生します。
だから私はStackoverflowでここで大量の質問/回答を読み、Ayende RehienとFluentのWikiを調べて、さまざまなセットアップを試してみましたが、役に立ちませんでした(つまり、逆のさまざまなカスケードオプションを削除します..)。
現在、私のエンティティは次のようになっています。
public class Product
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IEnumerable<Attribute> Attributes { get; set; }
}
public class Attribute
{
public virtual int Id { get; set; }
public virtual Product Product { get; set; }
public virtual IEnumerable<AttributeValue> Values { get; set; }
}
public class AttributeValue
{
public virtual int Id { get; set; }
public virtual Attribute Attribute { get; set; }
public virtual string Value { get; set; }
}
私の Fluent マッピングは次のようになります。
public class ProductMap : ClassMap<Product>
{
public ProductMap()
{
Id(x => x.Id);
Map(x => x.Name);
Map(x => x.Description);
HasMany(x => x.Attributes).Inverse().Cascade.All();
}
}
public class AttributeMap : ClassMap<Attribute>
{
public AttributeMap()
{
Id(x => x.Id);
Map(x => x.Name);
References(x => x.Product);
HasMany(x => x.Values).Inverse().Cascade.All();
}
}
public class AttributeValueMap : ClassMap<AttributeValue>
{
public AttributeValueMap()
{
Id(x => x.Id);
Map(x => x.Value);
References(x => x.Attribute);
}
}
私の DB スキーマは、Attributes および AttributesValues テーブルの参照列に null を許可しないように設定されていますが、戻って更新するように設定できることを読んだので、null を許可してみましたが、そうではありませんでした。
子オブジェクトを保存できず、Nhibernate に参照フィールドの親 ID を保存させることができない理由を突き止めることができませんでした。多くの例を見てきましたが、外部キーを設定してマッピングで参照する必要はありませんでした。
何かご意見は?