7

データベース用の小さなサービス ツールに取り組んでいます。私の問題は、最後の更新により、いくつかの smallint-columns を整数に変更する必要があったことです。

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

}

タイプを Int16 から int に変更しました。古いバージョンのデータベースではもう使用できないことを除いて、すべて正常に動作します。例外は、「System.Int32が期待され、Typ System.Int16が見つかりました」のようなものです。

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

何か案は?私の環境: EntityFramework 5.0.0 .NET 4.5 FirebirdClient 3.0.2.0

モデルビルダーでキャストを強制しようとしました:

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

例外:

エラー 2019: 指定されたメンバー マッピングが無効です。タイプ 'ContextRepository.TEST' のメンバー 'ID' のタイプ 'Edm.Int32[Nullable=False,DefaultValue=]' は、メンバーの 'FirebirdClient.smallint[Nullable=False,DefaultValue=,StoreGeneratedPattern=Identity]' と互換性がありませんタイプ「CodeFirstDatabaseSchema.BUNDLAND」の「SCHLUESSEL」

ID を Int16 にしてから、すべてを smallint (HasColumnType("int")) にキャストすると正常に動作しますが、31767(smallint max) より大きい数値で例外が発生します...

4

1 に答える 1

11

私の問題の解決策を見つけました!モデルで 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,
    });
于 2013-08-12T14:29:04.467 に答える