2012-07-17 58 views
1

使用遺留表需要基於兩個char(3)字段創建CompositeId。沒有看到任何使Fluent可以實現的重載。可能使用CompositeId的CustomSqlType?

映射我試圖看起來像這樣:

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

KeyReference將搜索被引用實體的地圖並在那裏使用sqltype。去參考實體並指定Id(x => x.Id).Length(3)

+0

引用的實體已經指定其類型,如CustomSqlType( 「CHAR(3)」)。在這種情況下,我不能使用普通長度(3),因爲我不想使用nvarchar,但是使用char。 – heyseuss 2012-07-18 12:28:26

+0

很奇怪。我必須調查 – Firo 2012-07-18 13:30:28

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