2014-03-28 149 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

相关问题