1

レガシーテーブルを使用するには、2つのchar(3)フィールドに基づいてCompositeIdを作成する必要があります。Fluentでこれを可能にする過負荷は見られません。

私が試みているマッピングは次のようになります。

CompositeId()
.KeyProperty(x => x.LegacyEntity1Id, "LegacyEntity1Id")
.KeyProperty(x => x.LegacyEntity2Id, "LegacyEntity2Id");

Map(x => x.LegacyEntity1Id).CustomSqlType("char(3)");
Map(x => x.LegacyEntity2Id).CustomSqlType("char(3)");

私も試しました:

CompositeId()
    .KeyReference(x => x.LegacyEntity1, "LegacyEntity1Id")
    .KeyReference(x => x.LegacyEntity2, "LegacyEntity2Id");

Map(x => x.LegacyEntity1Id).CustomSqlType("char(3)");
Map(x => x.LegacyEntity2Id).CustomSqlType("char(3)");

どちらも同じ結果になります。テーブルは適切な複合IDで生成されますが、両方の列がデフォルトのnvarchar(255)です。その結果、親テーブルがchar(3)であるため、外部キーの生成に失敗し、例外が発生します。

Fluent経由でマッピングすることはできませんか?

そうでない場合は、次のようにマッピングすることに実際の違いはありますか?*:

Id(x => x.Id).GeneratedBy.Identity();

Map(x => x.LegacityEntity1Id).CustomSqlType("char(3)");
Map(x => x.LegacityEntity2Id).CustomSqlType("char(3)");

References(x => x.LegacityEntity1).Column("LegacityEntity1Id").UniqueKey("1").Not.Nullable();
References(x => x.LegacityEntity2).Column("LegacityEntity2Id").UniqueKey("1").Not.Nullable();

*レガシーテーブルはローカルSQLインスタンスにETLされているため、テーブルをわずかに変更することができます(IDを追加するのに十分です)。

または、別の代替アプローチがありますか?この場合、HasManyToManyを使用することはできません。これは、その価値があるためです(ペイロードがあります)。

4

2 に答える 2

0

これは2017年にそれを行う方法です:

CompositeId()
  .KeyProperty(
     x => x.LegacyEntity1Id, 
     k => k.ColumnName("LegacyEntity1Id").Type("AnsiString").Length(3))
  .KeyProperty(
     x => x.LegacyEntity2Id, 
     k => k.ColumnName("LegacyEntity2Id").Type("AnsiString").Length(3))
于 2017-02-24T17:51:16.337 に答える