1

使用旧表时,需要基于两个 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();

* 我确实有能力稍微修改表(足以添加身份),因为旧表正在 ETL 到本地 SQL 实例中。

还是有另一种替代方法?在这种情况下,不能使用 HasManyToMany,因为它的价值(将有一个有效负载)。

4

2 回答 2

0

KeyReference 将搜索被引用实体的映射并在那里使用 sqltype。转到引用的实体并指定Id(x => x.Id).Length(3).

于 2012-07-18T10:58:31.370 回答
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 回答