我有一个POCO模型类和一个现有的数据库表,我都无法更改我正在使用Entity Framework 6和Fluent API。
模型类的CountryId为' int'。但是,在数据库表中,CtryId是一个< tinyint'。
我尝试使用
设置类型modelBuilder.Entity<Event>().Property(e => e.CountryId).HasColumnName("CtryId").HasColumnType("tinyint");
在OnModelCreating方法中但是得到以下错误:
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'.
如何使用Entity Framework Code First将C#int映射到SqlServer tinyint?
答案 0 :(得分:6)
你不能。
映射“排列”如下。
POCO上的属性应为“byte”。
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上放置一个实体框架“ignore”属性
答案 1 :(得分:0)
在EF中,int32
映射到数据库中的int
。在这种情况下,tinyint
映射到.NET框架中的byte
。您应该将您的CountryId
更改为POCO模型中byte
的类型。
答案 2 :(得分:-1)
您可以使用byte
列创建一个新的POCO类,并使用它而不是旧的POCO类。
您可以使用AutoMapper复制较高层中使用的旧POCO类与存储库层中使用的新POCO类之间的值以进行存储。