20

だから私はMVC3とEF4を学んでいます。コードファーストの方法を試してみましたが、私には難しすぎました.クラスを問題なく作成できますが、外部キーと相互の関係を処理するときに難しい部分があります.

しかし、私は最初にモデルを使用しました。このようにして、視覚的に設計し、関係がどこにあるかを確認できます。

モデルが作成されると、SQL Express データベースに対して実行する SQL が作成されます。やった、やった。

今、テーブルにデータが必要です。もちろん、サーバー エクスプローラーを使用してそれらを追加することもできますが、作業を進めながらモデルに変更を加える可能性が高いです。そして、データベースを更新し続けます。そのため、手動でデータを入力し続けることはできません。DropCreateDatabaseIfModelChanges最初にコードを使用する場合は、メソッドを派生させてオーバーライドできることを知っていますseed

ただし、モデルファーストアプローチでこれを行うにはどうすればよいですか? 次のコードがあります。

 public class DatabaseInitializer : IDatabaseInitializer<BettingContext> {
    public void InitializeDatabase(BettingContext context) {
        var teams = new List<Team> {
            new Team { Name="Toronto Maple Leafs", League="NHL"},
            new Team { Name="Boston Bruins", League="NHL"},
            new Team { Name="Vancouver Canucks", League="NHL"},
            new Team { Name="Nashville Predators", League="NHL"},
            new Team { Name="Montreal Canadiens", League="NHL"},
        };
    }
}

もちろん、私のグローバルファイルでは:

protected void Application_Start()
{
    Database.SetInitializer<BettingContext>(new DatabaseInitializer());
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

んで、どうする?メソッドを実行するように指示するにはどうすればよいですか? 私は何を間違っていますか?

4

3 に答える 3

13

モデル ファーストは、作業中にモデルから実際にデータベースを生成するため、コード ファーストとは大きく異なります。データベースを作成して手動で実行するための SQL を取得するため、シード データを含む 2 番目の SQL スクリプトをこの横に置いておくのが論理的であることがわかりました。

モデルに変更を加えると、SQL スクリプトが更新されます。もちろん、シード SQL スクリプト (データベース作成スクリプトのすぐ隣に便利に配置されています) を確認する必要があります。

このアプローチはこれまでのところ問題なく機能しており、「このデータ ローダーはどこにあり、空のデータベースをどのように識別するのか」という混乱を引き起こすことはありません。(これらの両方の SQL スクリプトをセットアップ プロジェクトに含めて、カスタム アクションでシード データを使用してデータベースを作成することもできます。)

于 2012-05-11T11:17:14.643 に答える
6

次のようなものがあります。

public class MySeedData : DropCreateDatabaseIfModelChanges<YourDataBaseContextClass>
{
    protected override void Seed(YourDataBaseContextClass context)
    {  
       // Create objects here and add them to your context DBSets...

    }
}

public class YourDataBaseContextClass : DbContext
{


}

次に、Application_Start()あなたの中で次を呼び出します:

Database.SetInitializer(new MySeedData());

あなたの場合、(モデルの最初のクラスを使用して) DbSets を手動で作成し、上記のコードを使用してプラグインを試みることができます。モデル ファーストとコード ファーストを組み合わせたようなものです。

public class FourthCoffeeWebContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

これに追加: CreateDatabaseIfNotExists<(Of <(<'TContext>)>)>

于 2011-05-15T02:48:42.327 に答える
0

次のような Seeding Controller を使用します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyProject.Models;

namespace MyProject.Controllers
{
    public class SeedController : Controller
    {
        public string Index()
        {
            ContactDBContext db = new Models.ContactDBContext();

            Person person = new Person();
            person.FullName = "Mr Test";
            person.Notes = "It's me!";
            db.People.Add(person);
            db.SaveChanges();
            return "Seeding complete.";
        }
    }
}

次に、Model Entity ダイアグラムからデータベースを再作成した後、Web サイトの「/Seed」URL に移動するだけで、シード データが再入力されます。

于 2016-08-13T12:42:36.460 に答える