CodeFirstモデルを使用してEntityFrameworkによって生成されたデータベースを使用しています。それ以来、モデルを数回変更し、モデルの変更に応じてデータベースを変更するコードを生成するパッケージマネージャーコンソールに精通しています。
楽観的同時実行制御を実行するためにいくつかのフィールドを追加するまでは、これまでのところうまく機能しています。モデルに追加したフィールドは次のとおりです。
public int Rowversion { get; set; }
public DateTime MLTimestamp { get; set; }
2番目のフィールドの名前は「MLTimestamp」ですが、元々はTimestampという名前でした。データベースを更新しようとしたときに受け取ったエラーを修正するために変更しました。
したがって、パッケージマネージャーが生成したコードは次のとおりです。
public partial class MediaTypeRowversion : DbMigration
{
public override void Up()
{
AddColumn("MediaTypes", "Rowversion", c => c.Int(nullable: false));
AddColumn("MediaTypes", "MLTimestamp", c => c.DateTime(nullable: false));
}
public override void Down()
{
DropColumn("MediaTypes", "MLTimestamp");
DropColumn("MediaTypes", "Rowversion");
}
}
Update-Database
パッケージマネージャーコンソールから実行すると、次のエラーメッセージが表示されます。
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
The statement has been terminated.
自分が行おうとしていると思われる変換がわかりません。これは、以前はデータベースに存在しなかったフィールドでした。「変換」するものは何もありません。前述のように、2番目のフィールドは元々Timestampという名前だったので、額を叩いて、ああ、データベースにその名前のフィールドがすでに存在しているはずだと言いました。そのため、モデルと移行コードで変更しましたが、それでもこのエラーが発生します。
これらのフィールドはどちらも、としてデータ注釈が付けられていませんTimestamp
。EFがすでにどれほど苛立たしいものであるかを考えると、独自の行バージョンの同時実行性チェックを実装する方が簡単であり、Session-Stateモックアップの魅力のように機能すると思いました。
.mdfファイルを削除し、同じ名前の別のファイルを追加して、テーブルを最初から再構築できるようにしましたが、これは明らかにそれほど単純に解決するものではありません。EFはC#のDateType値とSQL Serverの日時の値の間を行き来しようとすると消化不良になるように見えるので、タイムスタンプを文字列として保存するという考えを受け入れていますが、これを可能であればDateTime。
とにかく、誰かが私がこれを乗り越える方法についていくつかの指針を提供することができれば、私は非常に感謝するでしょう!