可以将CustomSqlType与CompositeId一起使用吗?

时间:2012-07-17 17:44:31

标签: c# nhibernate fluent-nhibernate

使用旧表需要基于两个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,因为它的价值(将有一个有效载荷)。

2 个答案:

答案 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))