最近、既存の製品を Entity Framework Code First Migrations を使用するように切り替えました。移行はかなり苦痛でしたが、この時点でほぼすべてを乗り越えました。ローカル環境で動作するようになったので、展開環境にプッシュしました。残念ながら、私たちの展開環境は、新しい EF 移行で何かをサポートしていないようです。
私たちの環境は、Web (.Net MVC3) サーバーとソケット サーバーの 2 つのサーバーで構成されており、どちらも Windows Azure で実行されています。問題はソケット サーバーでのみ発生しているように見えます。実際、Entity Framework はデータベース ハッシュが一致しないことを通知しています (を使用context.Database.CompatibleWithModel()
)。
DB モデルがコード モデルと一致しないことを EF が通知しているという事実を無視すると、遭遇する唯一のエラーは、複合キーを持つエンティティ オブジェクトの挿入です。他のすべてのエンティティは問題なく作成できます。すべてのエンティティ クラスは、基本クラスから派生します。
class BaseEntity {
[HiddenInput(DisplayValue = false)]
[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual long Id { get; set; }
}
EF が複合キーをサポートするには、「Order」ピースを追加する必要がありました。問題のあるモデルは次のようになります。
class SubEntity {
[MaxLength(255)]
[Required]
[Key, Column(Order = 1)]
public string Name { get; set; }
}
コンテキストに新しいオブジェクトを追加して変更を保存しようとすると、明示的に を設定できず、 を使用SubEntity
できないというエラーが SQL から返されます。Id
IDENTITY_INSERT ON
コードは、ローカル マシンと Web サーバーで正常に動作します。DB モデルは互換性があり、「SubEntity」オブジェクトを問題なく作成できます。
私には、ソケット サーバー環境の EF は[DatabaseGenerated]
、複合キーを使用するときに注釈を無視しているように見えます。これにより、エラーが説明され、DB モデルに互換性がない理由が説明されます。これは理にかなっていますか?環境に EF の動作を変えるものはありますか?