使用旧表需要基于两个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();
*我确实能够稍微修改表(足以添加标识),因为遗留表正在ETLed到本地SQL实例中。
还是有其他替代方法吗?在这种情况下,不能使用HasManyToMany,因为它的价值(将有一个有效载荷)。
答案 0 :(得分:0)
KeyReference将搜索引用实体的映射并在那里使用sqltype。转到引用的实体并指定Id(x => x.Id).Length(3)
。
答案 1 :(得分: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))