1

Fluent NHibernate を使用して既存のデータベースをマップしようとしていますが、複雑な多対多の関係 (追加の列) に関して問題が発生しました。

追加の列を持つ多対多の関係は、純粋な多対多の関係ではないため、HasManyマッピングする必要があることを知っています。HasManyToManyリンク テーブルは、それ自体のクラスとしてマップする必要があります。これは、以下の例で行っています。

このデータを既存のデータベースからロードすると、正常にロードされます。私が取り組んでいるプロジェクトは、このデータを取得して、問題が発生する空のデータベースに挿入します。新しいデータベースに挿入するときに、データベースで許可されていない値をCompositeId挿入しようとしていると思います。データベース構造を変更することは、現時点では実行可能なオプションではありません。この問題を回避する方法はありますか?NULLItemIDItemGroupID

ありがとう、以下のコード例。


エンティティ クラス

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

1 に答える 1

0

DisplayOrder がリンク テーブルの唯一の余分な列であると仮定すると、IList のリスト インデックスを順序として使用しないのはなぜですか?

public class ItemGroup
{
    public virtual long ItemGroupID { get; set; }
    public virtual string Name { get; set; }

    public virtual IList<Item> Items { get; private set; }
}

public class ItemGroupMap : ClassMap<ItemGroup>
{
    public ItemGroupMap()
    {
        Table("ItemGroups");
        Id(x => x.ItemGroupID).GeneratedBy.Identity();

        Map(x => x.Name);
        HasManyToMany(x => x.ItemsInGroup)
            .Table("ItemsInGroups")
            .ParentKeyColumn("ItemGroupID")
            .ChildKeyColumn("ItemID")
            .AsList("DisplayOrder")
            .Cascade.All();
    }
}
于 2013-09-27T10:04:13.703 に答える