Fluent NHibernate を使用して既存のデータベースをマップしようとしていますが、複雑な多対多の関係 (追加の列) に関して問題が発生しました。
追加の列を持つ多対多の関係は、純粋な多対多の関係ではないため、HasMany
マッピングする必要があることを知っています。HasManyToMany
リンク テーブルは、それ自体のクラスとしてマップする必要があります。これは、以下の例で行っています。
このデータを既存のデータベースからロードすると、正常にロードされます。私が取り組んでいるプロジェクトは、このデータを取得して、問題が発生する空のデータベースに挿入します。新しいデータベースに挿入するときに、データベースで許可されていない値をCompositeId
挿入しようとしていると思います。データベース構造を変更することは、現時点では実行可能なオプションではありません。この問題を回避する方法はありますか?NULL
ItemID
ItemGroupID
ありがとう、以下のコード例。
エンティティ クラス
public class Item
{
public virtual long ItemID { get; set; }
public virtual string Name { get; set; }
}
public class ItemGroup
{
public virtual long ItemGroupID { get; set; }
public virtual string Name { get; set; }
public virtual IList<ItemInGroup> ItemsInGroup { get; set; }
}
public class ItemInGroup
{
public virtual Item Item { get; set; }
public virtual ItemGroup ItemGroup { get; set; }
public virtual int? DisplayOrder { get; set; }
}
クラスのマッピング
public class ItemMap : ClassMap<Item>
{
public ItemMap()
{
Table("Items");
Id(x => x.ItemID).GeneratedBy.Identity();
Map(x => x.Name);
}
}
public class ItemGroupMap : ClassMap<ItemGroup>
{
public ItemGroupMap()
{
Table("ItemGroups");
Id(x => x.ItemGroupID).GeneratedBy.Identity();
Map(x => x.Name);
HasMany(x => x.ItemsInGroup).KeyColumn("ItemGroupID").Cascade.All();
}
}
public class ItemInGroupMap : ClassMap<ItemInGroup>
{
public ItemInGroupMap()
{
Table("ItemsInGroups");
CompositeId().KeyReference(x => x.Item, "ItemID")
.KeyReference(x => x.ItemGroup, "ItemGroupID");
Map(x => x.DisplayOrder);
}
}