如何使用Entity Framework CodeFirst使我的数据库成为种子?

Ale*_*lec 62 frameworks entity entity-framework code-first asp.net-mvc-3

数据库已成功创建(与表一样)但未加种.我花了几个小时阅读了大量文章但却未能得到它.有什么建议?

另外,是否可以在客户端中没有引用我的DatabaseContext的情况下调用初始化程序?

我已经包含了我能想到的所有相关代码.如果有任何其他方面的帮助,请告诉我.

我试过的事情:

  1. 我删除了我的连接字符串(因为它默认为sqlexpress,只是更改了名称)
  2. 我将DropCreateDatabaseIfModelChanges更改为DropCreateDatabaseAlways,仍然相同.

编辑:非常奇怪的是它曾经工作过一次,但我不知道它是如何或为什么再次破坏.我假设连接字符串,但谁知道.

DatabaseInitializer.cs

public class DatabaseInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext>
{
  protected override void Seed(DatabaseContext context)
  {
    // Seeding data here
    context.SaveChanges();
  }
}
Run Code Online (Sandbox Code Playgroud)

DatabaseContext.cs

public class DatabaseContext : DbContext
{
  protected override void OnModelCreating(DbModelBuilder mb)
  {
    // Random mapping code
  }

  public DbSet<Entity1> Entities1 { get; set; }
  public DbSet<Entity2> Entities2 { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

Global.asax.cs - Application_Start()

protected void Application_Start()
{
  Database.SetInitializer<DatabaseContext>(new DatabaseInitializer());
  AreaRegistration.RegisterAllAreas();
  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)

客户端web.config

<connectionStrings>
  <add name="DatabaseContext" connectionString="data source=.\SQLEXPRESS;Database=Database;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

为了记录,我在这里分享我的解决方案.无论如何,浏览所有评论都会很痛苦.最后,我将DatabaseInitializer和DatabaseContext放在不同的类中.我真的不明白,虽然这些微小的变化修复了它,但在这里它是.

DatabaseInitializer.cs

public class DatabaseInitializer : CreateDatabaseIfNotExists<DatabaseContext>
{
  protected override void Seed(DatabaseContext context)
  {
    // Seed code here
  }
}
Run Code Online (Sandbox Code Playgroud)

DatabaseContext.cs

public class DatabaseContext : DbContext
{
  public DatabaseContext() : base("MyDatabase") { }

  protected override void OnModelCreating(DbModelBuilder mb)
  {
    // Code here
  }

  public DbSet<Entity> Entities { get; set; }
  // Other DbSets
}
Run Code Online (Sandbox Code Playgroud)

Global.asax.cs - Application_Start()

protected void Application_Start()
{
  Database.SetInitializer(new DatabaseInitializer());
  AreaRegistration.RegisterAllAreas();
  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*elo 37

这就是我的DbContext类看起来像什么,它们播种得很好:

public class MyDbContext : DbContext
{
    public DbSet<MyClass> MyClasses { get; set; }

    protected override void OnModelCreating (DbModelBuilder modelBuilder)
    {
        base.OnModelCreating (modelBuilder);
        modelBuilder.Conventions.Remove<System.Data.Entity.ModelConfiguration.Conventions.PluralizingTableNameConvention> ();

        // Add any configuration or mapping stuff here
    }

    public void Seed (MyDbContext Context)
    {
        #if DEBUG
        // Create my debug (testing) objects here
        var TestMyClass = new MyClass () { ... };
        Context.MyClasses.Add (TestMyClass);
        #endif

        // Normal seeding goes here

        Context.SaveChanges ();
    }

    public class DropCreateIfChangeInitializer : DropCreateDatabaseIfModelChanges<MyDbContext>
    {
        protected override void Seed (MyDbContext context)
        {
            context.Seed (context);

            base.Seed (context);
        }
    }

    public class CreateInitializer : CreateDatabaseIfNotExists<MyDbContext>
    {
        protected override void Seed (MyDbContext context)
        {
            context.Seed (context);

            base.Seed (context);
        }
    }

    static MyDbContext ()
    {
        #if DEBUG
        Database.SetInitializer<MyDbContext> (new DropCreateIfChangeInitializer ());
        #else
        Database.SetInitializer<MyDbContext> (new CreateInitializer ());
        #endif
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经使用过这种模式几次,它对我来说非常好.

  • 这不是我完全实现的解决方案,我在上面的原始问题中详述了我的解决方案.只是发布此评论,以方便将来的用户使用.感谢jdangelo的所有帮助! (2认同)

use*_*352 10

Seed即使正确调用Database.SetInitializerin 也没有调用我的方法Application_Start......原因很简单:如果你还没有任何实际使用数据库上下文的代码,可能根本就没有调用初始化程序.


Dav*_*ous 9

这是我悲伤的小故事.

一,经验教训:

  1. 在使用上下文之前,不会调用种子方法.
  2. Global.asax.cs在连接调试器之前运行的第一次运行时不会遇到断点.要在Global.asax.cs上找到断点,你可以为Web.config添加一些空格并点击页面; 然后就会受到打击.
  3. 如果存在与db的VS连接,则不会发生种子设定.该应用程序将抛出一个错误.

所以,为了避免悲伤:

  • 断开VS连接.
  • 切换基类DropCreateDatabaseAlways一次性.
  • 点击使用上下文的页面.

现在,悲伤:

  1. 我在Global.asax.cs文件中有自定义的Initializer类.我的Initializer Seed方法有一个断点; 我启动了应用程序,该方法从未受到打击.:(
  2. 我在Application_Start中的Database.SetInitializer调用中指出了一个断点.从未受到打击.:(
  3. 我意识到我没有db模式更改,因此我将DropCreateDatabaseIfModelChanges更改为DropCreateDatabaseAlways.依然没有.:(
  4. 我终于进入了一个使用上下文的页面,它起作用了.:/