0

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。

とにかく、誰かが私がこれを乗り越える方法についていくつかの指針を提供することができれば、私は非常に感謝するでしょう!

4

2 に答える 2

2

タイム スタンプ フィールドは null にできません。SQL が列を追加するとき、その列にはデフォルト値がありません。SQL または EF のいずれかが、既存のレコードの新しい列に空の文字列を提供しようとしているだけで、変換の問題が発生していると推測しています。

タイムスタンプを DateTime にしてみませんか? つまり、null 可能です。または、移行は、既存の列に使用するデフォルト値を提供する方法を提供すると思います(私のPCではないため、確認できません)。

于 2012-03-03T05:57:11.787 に答える
0

@Fransはあなたを正しい軌道に乗せました。ただし、データ モデルを変更せずにこの目標を達成したい場合は、移行を変更して、DateTime 列を null 許容として追加してから、null 許容に変更することができます。

これにより、デフォルト値の定義のない null 非許容の列が生成されます (つまり、挿入を行うたびに値を指定する必要があります。SQL は日時を生成しません)。

public partial class AddDateColumToMyEntity : DbMigration
{
    public override void Up()
    {
        // EF4.3 bug, gotta create date nullable, then change to non-nullable
        AddColumn("MyEntity", "SomeDateField", c => c.DateTime(nullable: true));
        AlterColumn("MyEntity", "SomeDateField", c => c.DateTime(nullable: false));
    }
}
于 2012-08-14T20:07:30.063 に答える