首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用实体框架CodeFirst让我的数据库成为种子?

如何使用实体框架CodeFirst让我的数据库成为种子?
EN

Stack Overflow用户
提问于 2011-06-11 05:38:34
回答 12查看 68.9K关注 0票数 62

数据库已成功创建(与表一样),但未设定种子。我花了几个小时,阅读了大量的文章,但还是没能读懂。有什么建议吗?

顺便说一句,是否可以在不引用客户端中的DatabaseContext的情况下调用初始化器?

我已经包含了我能想到的所有相关代码。如果还有什么需要帮助的,请让我知道。

我尝试过的东西:

  1. 我删除了我的连接字符串(因为它是默认的sqlexpress,只是名称改变了)
  2. 我把DropCreateDatabaseIfModelChanges改成了DropCreateDatabaseAlways,仍然是一样。

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

DatabaseInitializer.cs

代码语言:javascript
复制
public class DatabaseInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext>
{
  protected override void Seed(DatabaseContext context)
  {
    // Seeding data here
    context.SaveChanges();
  }
}

DatabaseContext.cs

代码语言:javascript
复制
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; }

}

Global.asax.cs - Application_Start()

代码语言:javascript
复制
protected void Application_Start()
{
  Database.SetInitializer<DatabaseContext>(new DatabaseInitializer());
  AreaRegistration.RegisterAllAreas();
  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);
}

客户端web.config

代码语言:javascript
复制
<connectionStrings>
  <add name="DatabaseContext" connectionString="data source=.\SQLEXPRESS;Database=Database;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>

解决方案

为了便于文档记录,我在这里分享我的解决方案。无论如何,浏览所有的评论将是一件痛苦的事情。最后,我将DatabaseInitializer和DatabaseContext放在不同的类中。我真的不太明白这些微小的改变可以修复它,但它就在这里。

DatabaseInitializer.cs

代码语言:javascript
复制
public class DatabaseInitializer : CreateDatabaseIfNotExists<DatabaseContext>
{
  protected override void Seed(DatabaseContext context)
  {
    // Seed code here
  }
}

DatabaseContext.cs

代码语言:javascript
复制
public class DatabaseContext : DbContext
{
  public DatabaseContext() : base("MyDatabase") { }

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

  public DbSet<Entity> Entities { get; set; }
  // Other DbSets
}

Global.asax.cs - Application_Start()

代码语言:javascript
复制
protected void Application_Start()
{
  Database.SetInitializer(new DatabaseInitializer());
  AreaRegistration.RegisterAllAreas();
  RegisterGlobalFilters(GlobalFilters.Filters);
  RegisterRoutes(RouteTable.Routes);
}
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-06-14 01:35:58

这就是我的DbContext类的样子,它们的种子都很好:

代码语言:javascript
复制
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
    }
}

我已经使用过这个模式几次了,它对我来说效果很好。

票数 37
EN

Stack Overflow用户

发布于 2012-02-12 01:15:59

即使在Application_Start中正确调用了Database.SetInitializer,我的Seed方法也没有被调用...原因非常简单:如果您还没有任何实际使用数据库上下文的代码,则可能根本不会调用初始化程序。

票数 10
EN

Stack Overflow用户

发布于 2012-11-22 08:35:23

这是我的伤感小故事。

首先,总结经验教训:

  1. 在使用上下文之前不会调用种子方法。
  2. Global.asax.cs不会在附加调试器之前运行的第一次运行bc中命中断点。要在Global.asax.cs上命中断点,您可以在Web.config中添加一些空格并命中页面;然后页面将被命中。
  3. 如果存在与数据库的VS连接,则不会发生种子设定。应用程序将抛出错误。

所以,为了避免悲伤:

  • 断开您的VS与基类DropCreateDatabaseAlways的连接,只需一次。
  • 将访问使用上下文的页面。

现在,悲哀的是:

  1. 我在我的Global.asax.cs文件中有我的自定义初始化器类。我的初始化器种子方法有一个中断点;我启动了应用程序,但该方法从未命中。:(
  2. 我在Application_Start中的Database.SetInitializer调用中指出了一个断点。从来没有被击中过。:(
  3. 我意识到我没有数据库模式更改,所以我将DropCreateDatabaseIfModelChanges更改为DropCreateDatabaseAlways。还是什么都没有。:(
  4. 我终于转到一个使用上下文的页面,它起作用了。:/
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6312336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档