3

しばらくの間、次にシード メソッドが実行されたときに更新されたデータが上書きされることを恐れずに、移行構成でシード メソッドを使用する方法に関する解決策を見つけようとしていました。

要するに、さまざまなチュートリアルで示されているように、 addorupdate は各オブジェクトのすべての値をリセットするため、最初にシードされてからそのオブジェクトに発生した可能性のある変更を上書きするということです。

現在のプロジェクトでは、一連のデフォルトの電子メール テンプレートをシードできるようにしたいと考えています。これらをシード メソッドに入れることで、コードに常に存在することが保証されます。ただし、アプリケーションのユーザーが必要に応じて一部のコンテンツを編集できるようにしたいと考えています。したがって、変更を削除するため、シード メソッドが実行するすべてのテンプレートをリセットすることはできません。

私の解決策はこれです:

    protected override void Seed(Jobboard.Sandbox.Model.JobboardContext context)
    {
        Guid DefaultTemplateGuid = Guid.Parse("xxxxx");

        context.Templates.AddOrUpdate(
              t => t.Guid,
                  context.Templates.FirstOrDefault(x => x.Guid == DefaultTemplateGuid)
                  ?? new Template {
                     Guid = DefaultTemplateGuid,
                     Name = "Default Template",
                     Content = "Some Default Content"
                  }
        );
    }

全体として、これはうまく機能しているように見えます。私の質問は、EFチームがこの機能の使用を提案している方法とはまったく異なるため、この方法でシードを実行する問題を誰かが見つけることができるかどうかです。の上。

読んでくれてありがとう。

4

1 に答える 1

0

AddOrUpdate 拡張メソッドを使用しないことで、データベースへのトリップをいくつか節約できる可能性があります。これは、コードの簡略化されたバージョンです。

protected override void Seed(Jobboard.Sandbox.Model.JobboardContext context)
{
    var defaultTemplateGuid = Guid.Parse("xxxxx");
    var defaultTemplate = context.Templates.SingleOrDefault(
        t => t.Guid == defaultTemplateGuid);

    if (defaultTemplate == null)
    {
        context.Templates.Add(
            new Template
                {
                    Guid = defaultTemplateGuid,
                    Name = "Default Template",
                    Content = "Some Default Content"
                });
    }
}
于 2012-12-06T02:06:27.450 に答える