2013-08-07 102 views
5

我正在为数据库的小型服务工具工作。我的问题是,由于上次更新,一些smallint-colums不得不被更改为整数。实体框架代码优先 - 铸造smallint和整数int32

public class TEST 
{ 
    public int ID { get; set; } 
    //public Int16 ID { get; set; } 
    public string TEST { get; set; } 

} 

我将类型从Int16更改为int。一切工作正常,除了我不能使用它的旧版本的数据库了。异常是类似“System.Int32预期,发现类型System.Int16”。

有没有办法将所有smallint和整数转换为int32?

任何想法?我的环境:5.0.0的EntityFramework .NET 4.5 FirebirdClient 3.0.2.0

我试图迫使在模型构建器铸造:

 modelBuilder.Entity<TEST>() 
     .Property(p => p.ID) 
     .HasColumnType("smallint"); 

例外:

错误2019:会员映射指定为无效。 Typ'ContextRepository.TEST'中成员'ID'的'Edm.Int32 [Nullable = False,DefaultValue =]'类型与成员'FirebirdClient.smallint [Nullable = False,DefaultValue =,StoreGeneratedPattern = Identity]'不兼容在类型“CodeFirstDatabaseSchema.BUNDLAND”

使该ID的Int16“SCHLUESSEL”,然后浇注一切SMALLINT(HasColumnType(“INT”))工作正常,但会给我例外比31767(SMALLINT最大值)更大的数字...

+0

为什么不能升级数据库以使用INTEGER作为此列? –

+0

我只写了一个维护程序,并在主应用程序中担心副作用... – Dust258

回答

7

我找到了我的问题的解决方案!我在我的模型中使用的Int16和使用模型构建器设置科拉姆型到SMALLINT:

public class TEST 
{ 
    public Int16 ID { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<TEST>().HasKey(a => new { a.ID}); 
    modelBuilder.Entity<TEST>() 
    .Property(p => p.ID) 
    .HasColumnType("SMALLINT"); 
    base.OnModelCreating(modelBuilder); 
} 

现在我可以强制转换为int的属性,而不除外(即使数字> 32767):

var lQry = (from b in ctData.TEST 
    select new 
    { 
     ID = (int)b.ID, 
    }); 
+0

我不明白这是如何编译的?你有两个同名的属性。 – michaelmsm89

+1

ups,现在修复它 – Dust258

+0

你需要HasColumnType(“SMALLINT”)吗?声明int16不够? –