60

私は単純なエンティティを持っています:

public class Hall
{
    [Key]
    public int Id {get; set;}

    public string Name [get; set;}
}

次に、テーブルにデータを入力するためSeedに使用する方法で、次のようにします。AddOrUpdate

var hall1 = new Hall { Name = "French" };
var hall2 = new Hall { Name = "German" };
var hall3 = new Hall { Name = "Japanese" };

context.Halls.AddOrUpdate(
    h => h.Name,
    hall1,
    hall2,
    hall3
);

次に、パッケージ管理コンソールで実行します。

Add-Migration Current
Update-Database

すべて問題ありません。テーブル「Hall」に3つの行があります。しかし、パッケージ管理コンソールでUpdate-Database再度実行すると、すでに5つの行があります。

Id  Name
1   French
2   Japaneese
3   German
4   French
5   Japanese

なんで?5行ではなく3行にする必要があると思います。Id代わりにプロパティを使用しようとしましNameたが、違いはありません。

アップデート:

このコードは同じ結果を生成します:

var hall1 = new Hall { Id = 1, Name = "French" };
var hall2 = new Hall { Id = 2, Name = "German" };
var hall3 = new Hall { Id = 3, Name = "Japanese" };

context.Halls.AddOrUpdate(
                h => h.Id,
                hall1);

context.Halls.AddOrUpdate(
                h => h.Id,
                hall2);

context.Halls.AddOrUpdate(
                h => h.Id,
                hall3);

また、nugetを介して最新のEntityFrameworkをインストールしています。

4

13 に答える 13

69

わかりました、これで1時間キーボードから顔を叩きました。テーブルの Id フィールドが Identity フィールドの場合は機能しないため、identifierExpression に別のフィールドを使用してください。Name プロパティを使用し、初期化子から Id フィールドも削除しましたnew Hall {...}

OPコードへのこの微調整は私にとってはうまくいったので、誰かに役立つことを願っています:

protected override void Seed(HallContext context)
{
    context.Halls.AddOrUpdate(
        h => h.Name,   // Use Name (or some other unique field) instead of Id
        new Hall
        {
            Name = "Hall 1"
        },
        new Hall
        {
            Name = "Hall 2"
        });

    context.SaveChanges();
}
于 2013-03-14T15:51:00.157 に答える
9

このコードは機能します:

public Configuration()
{
    AutomaticMigrationsEnabled = true;
}

protected override void Seed(HallContext context)
{
    context.Halls.AddOrUpdate(
        h => h.Id,
        new Hall
        {
            Id = 1,
            Name = "Hall 1"
        },
        new Hall
        {
            Id = 2,
            Name = "Hall 2"
        });

    context.SaveChanges();
}
于 2012-11-20T08:06:42.297 に答える
3

これは、エンティティの状態を正しく設定していない場合にも発生する可能性があります。update-database を実行すると、次のエラーが発生し続けました...「シーケンスには複数の一致する要素が含まれています。」

たとえば、各 update-database コマンドで重複した行が作成されていました (もちろん、データのシード時に発生することは想定されていません)。次に、複数の一致が見つかったため、次の update-database コマンドはまったく機能しませんでした。 (したがって、一致する行が複数あるというシーケンスエラー)。これは、ApplyStateChanges へのメソッド呼び出しでコンテキスト ファイルの SaveChanges をオーバーライドしたためです...

public override int SaveChanges()
{
    this.ApplyStateChanges();
    return base.SaveChanges();
}

ApplyStateChanges を使用して、オブジェクト グラフを追加するときに、オブジェクトが追加された状態か変更された状態かを Entity Framework が明示的に認識できるようにしていました。私が ApplyStateChanges をどのように使用しているかについての完全な説明は、ここにあります。

そして、これはうまく機能します (ただし注意事項!!) ... CodeFirst 移行を使用してデータベースのシードも行っている場合、上記のメソッドは Seed メソッド内の AddOrUpdate() 呼び出しに大混乱を引き起こします。したがって、何よりも前に、DBContext ファイルをチェックして、上記の方法で SaveChanges をオーバーライドしていないことを確認してください。一致する項目ごとに複数の行があるため、3 回目です。

結局のところ、AddOrUpdate() で Id を構成する必要はありません...これは、簡単で初期のデータベース シードの目的全体を無効にします。次のような方法で正常に動作します。

context.Students.AddOrUpdate(
    p => p.StudentName,
    new Student { StudentName = "Bill Peters" },
    new Student { StudentName = "Jandra Nancy" },
    new Student { StudentName = "Rowan Miller" },
    new Student { StudentName = "James O'Dalley" },

コンテキスト ファイルの SaveChanges メソッドを ApplyStateChanges の呼び出しでオーバーライドしていない限りは。お役に立てれば。

于 2013-07-28T21:24:00.880 に答える
1

AddOrUpdateID ではないフィールドで問題なく動作することがわかりました。これがうまくいく場合:context.Halls.AddOrUpdate(h => h.Name, hall1, hall2, hall3)

「French_test_abc_100」、「German_test_abc_100」などのホール名を使用することもできます。

これにより、アプリをテストしているときに、ハードコードされたテスト データによって問題が発生するのを防ぐことができます。

于 2012-11-03T20:27:43.303 に答える
0

既存のデータベースの移行を元に戻す (つまり、データベースをゼロから開始する) 必要がある可能性が高いと思いUpdate-Database TargetMigration:0ますUpdate-Database

そのままでは、既存のテーブルや値を削除するのではなく、それらの値を追加/更新するだけです。それはあなたの望む結果を得るために起こる必要があります。

于 2015-03-03T01:15:19.210 に答える
0

object(hall)のidが0の場合は挿入です。ホール オブジェクトの id フィールドを再確認する必要があると思います

于 2012-04-04T09:03:27.513 に答える
0

ID フィールドは Identity フィールドですか? 私はこの同じ問題に遭遇していました。ID フィールドから ID ステータスを削除し、ID をデータベースに設定すると、問題は解決しました。

これらはルックアップ テーブルであり、ID フィールドであってはならないため、これでうまくいきました。

于 2012-05-08T15:54:39.533 に答える