2014-03-28 191 views
4

我有一個POCO模型類和現有的數據庫表,這兩者都不能改變我正在使用Entity Framework 6和Fluent API。如何使用Entity Framework Code First將C#int映射到SqlServer tinyint?

模型類的CountryId爲'int'。但是,在數據庫表中,CtryId是'tinyint'。

我試圖設置在OnModelCreating方法使用

modelBuilder.Entity<Event>().Property(e => e.CountryId).HasColumnName("CtryId").HasColumnType("tinyint"); 

類型,但出現以下錯誤:

error 2019: Member Mapping specified is not valid. The type 'Edm.Int32[Nullable=False,DefaultValue=]' of member 'CountryId' in type 'RA.Data.Event' is not compatible with 'SqlServer.tinyint[Nullable=False,DefaultValue=]' of member 'CtryId' in type 'CodeFirstDatabaseSchema.Event'. 

如何映射一個C#的int使用實體框架代碼一個SQLServer TINYINT第一?

+0

你爲什麼不使用[字節](http://stackoverflow.com/ a/5863182/21727)在C#中? – mbeckish

+0

「這兩者都不能改變」 - 你能找到能夠*改變你的模型來匹配數據庫的人,反之亦然? – mbeckish

+0

您的「核心」POCO模型是「偏」類嗎? – Justin

回答

6

你不能。

映射「排隊」如下。

POCO的屬性應該是「字節」。

public byte CountryId{ get; set; } 

和映射:

 this.Property(t => t.CountryId).HasColumnName("CtryId"); 

既然你不想撕毀合同.....你可以做一個變通方法。

public byte JustForMappingCtryId{ get; set; } 

[NotMapped] 
public int CountryId 
{ 
get 
    { 
    return Convert.ToInt32(this.JustForMappingCtryId); 
    } 
set 
    { 
    if(value > 8 || value < 0) 
    { 
     throw new ArgumentOutOfRangeException("Must be 8 or less, and greater or equal to zero."); 
    } 
    //this.JustForMappingCtryId = value; /* Do a conversion here */ 
    } 
} 

和映射:

this.Property(t => t.JustForMappingCtryId).HasColumnName("CtryId"); 

,把一個實體框架 「忽略」 屬性上CountryId

+0

編輯提供解決方法。 – granadaCoder

0

在EF中,int32映射到db中的int。在這種情況下,tinyint映射到.NET框架中的byte。您應該在POCO模型中將CountryId更改爲byte的類型。

+3

-1 - '這兩者都不能改變' –

0

您可以使用byte列創建一個新的POCO類,並使用它來代替舊的POCO類。

您可以使用AutoMapper在較高層中使用的舊POCO類和存儲庫層中使用的新POCO類之間複製值以用於存儲目的。

+0

不會用另一個替代一個模型類被認爲是「改變」? – mbeckish

+1

不,如果舊類在引用程序集中,則無法更改。OP很清楚,他們不能改變*那個*類,而不是他們不能寫更多的代碼... –

+0

是的,但其他答案早些時候發佈,並且downvoted與這個建議一樣有用。例如,來自@Zafar的答案並不排除用新班級替換班級。 – mbeckish

相關問題