2013-08-07 24 views
5

データベース用の小さなサービスツールで作業しています。私の問題は、最後の更新によって、smallint-columのいくつかを整数に変更しなければならないということです。エンティティフレームワークコードファースト - int32にsmallintとintegerをキャスト

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

} 

タイプをInt16からintに変更しました。もう古いバージョンのデータベースでは使えないことを除いて、すべてうまく動作します。 Exceptionは、 "System.Int32が予想され、Typ System.Int16が見つかりました"のようなものです。

すべてのsmallintと整数をint32にキャストする方法はありますか?

アイデア?私の環境:EntityFramework 5.0.0 .NET 4.5 FirebirdClient 3.0.2.0

私はModelBuilderの中でキャストを強制しようとした:

 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' と、その後(HasColumnType( "INT")をSMALLINT)するために、すべてのキャストが正常に動作しますが、31767(SMALLINT MAX)よりも大きい数字で私に例外を与えるだろう...

+0

なぜこの列にINTEGERを使用するようにデータベースをアップグレードできませんか? –

+0

私はメンテナンスプログラムを書いているだけで、メインアプリケーションの副作用について心配しています... – Dust258

答えて

7

私の問題の解決策が見つかりました!私は私のモデルでInt16型を使用する必要がありますし、smallintにcolum型を設定するためにModelBuilderのを使用します。

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

私はこのコンパイル方法を理解していませんか?同じ名前の2つのプロパティがあります。 – michaelmsm89

+1

ups、今すぐ修正 – Dust258

+0

HasColumnType( "SMALLINT")が必要ですか?宣言int16で十分ではありませんか? –

関連する問題