7

現在、カスタムDAOフレームワークを使用しているプロジェクトをEntity Frameworkを使用して変換しようとしています。システムがかなり大きいので、データベース(SQL Azure DBはそれ自体が重要です)自体は特に実現可能ではないため、可能ならば避けるべきです。C#:エンティティフレームワークの検索データ型の変更

問題はID列にあります。残念ながら、システムが作成されたときには、bigintデータ型のテーブルと、intのテーブルがありますが、モデル自体は基本クラスのもので、IDはlongです。これまでのフレームワークはこのような状況に対応できましたが、私はエンティティフレームワークでそれを行う方法を見つけることができませんでした。以下は

は、私は考えることができる最も簡単な例である:

public class Context : DbContext { 
    public IDbSet<Foo> Foos {get;set;} 
    public IDbSet<Bar> Bars {get;set;} 
} 
public abstract class BaseClass { 
    public long ID; 
} 
public class Foo : BaseClass { 
    ... 
} 
public class Bar : BaseClass { 
    ... 
} 
SQL Table: Foo 
+-------------+ 
| id : bigint | 
| ...   | 
+-------------+ 
SQL Table : Bar 
+-------------+ 
| id : int | 
| ...   | 
+-------------+ 

私はBarモデルをロードしようとすると、私はこのエラーを取得:

The 'ID' property on 'BaseClass' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'Int64'. 

私が見つけるしたいのですがBarにintがあることをシステムに伝える方法、Fooは憧れている。私は文脈でOnModelCreatingを無効にして、BarのためにHasColumnTypeを定義しようとしました。

Schema specified is not valid. Errors: 
    (105,12) : error 2019: Member Mapping specified is not valid. The type 'Edm.Int64[Nullable=False,DefaultValue=]' of member 'ID' in type 'Bar' is not compatible with 'SqlServer.int[Nullable=False,DefaultValue=,StoreGeneratedPattern=Identity]' of member 'ID' in type 'CodeFirstDatabaseSchema.Bar'. 

私が唯一のサーバーにリクエストを送信する前intBaseClassIDの予想データ型を変更することができれば、その後、私は最高のことができるようにすべきであるように私には思える:それは私に新しいエラーを与えました応答を受け取った後、longに変換してください。理想的には、私はこれをクラス単位で行いたいと思っています。

誰でも正しい方向に向けることができますか?

答えて

4

bigint to an int in SQL Serverを暗黙的にキャストすることはできますが、EntityフレームワークのEDMタイプ(実際に処理しているもの)は、64ビット整数型から32ビットへの暗黙的な変換を許可していないようです整数型。

これはおそらく、オーバーフローしやすく、値がintフィールドに収まらないためです。

つまり、2つの基本クラス(int IDとlong ID)が必要です。それはかなりではありませんが、あなたが間違いなく望むロジックを強制します。データベース内のintに収まる値よりも大きな値を格納することはできないため、なぜコードレベルでそれを実行できるようにしたいのですか? Entityフレームワークは、その変換を適用させないためにここで正しいことをしています。

+0

ええ、それは私が恐れていたものです。私は別の間違ったものを間違って解決しようとしていることを認識しています。私はちょっとしたトリックで大きな変化を避けることができると思っていました。私が試したことのすべてがうまくいかなかったので、私はあなたが推薦したものを正確にやることに自分自身を辞めたと思う。 より良いソリューションがない場合は、これを正しいとマークします。 – Merwer

+0

@Merwer時々、真実が痛い、魔法使いを撃たないでください=) – casperOne

+0

こんにちは@casperOne同じトピックに沿っているので、私の質問にバージンして申し訳ありません。その反対をする方法はありますか?私はInt型のIDを持つテーブルを持っています。危険なほど大きくなっていて、それをロングに変更する方法があるのだろうか? (エンティティフレームワークCF 6。1) – hjavaher

関連する問題