entity-framework - 如何使用 Entity Framework Code First 为我的数据库提供种子?

标签 entity-framework asp.net-mvc-3 frameworks entity code-first

数据库已成功创建(表也是如此),但未设定种子。我花了几个小时并阅读了大量文章,但一直没能得到它。有什么建议吗?

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

我已经包含了我能想到的所有相关代码。如果还有什么有帮助的,请告诉我。

我尝试过的事情:

  1. 我删除了连接字符串(因为它默认为 sqlexpress,只是更改了名称)
  2. 我将 DropCreateDatabaseIfModelChanges 更改为 DropCreateDatabaseAlways,还是一样。

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

数据库初始化器.cs

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

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; }

}

Global.asax.cs - Application_Start()

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

客户端web.config

<connectionStrings>
  <add name="DatabaseContext" connectionString="data source=.\SQLEXPRESS;Database=Database;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
</connectionStrings>

解决方案

出于文档的目的,我在这里分享我的解决方案。无论如何,浏览所有评论都会很痛苦。最后,我将 DatabaseInitializer 和 DatabaseContext 放在不同的类中。我不太明白这些微小的变化是否解决了这个问题,但它就是这样。

数据库初始化器.cs

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

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
}

Global.asax.cs - Application_Start()

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

最佳答案

这就是我的 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
    }
}

我已经使用过这种模式几次,它对我来说非常有效。

关于entity-framework - 如何使用 Entity Framework Code First 为我的数据库提供种子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6312336/

相关文章:

entity-framework - Entity Framework 代码优先跨多个表的唯一约束

mysql - 带有 mysql 的 Entity Framework ,linux 和 windows 之间的表大写问题

asp.net - 编辑asp.net razor cshtml 文件需要重新编译吗?

c# - 我如何访问 ASP.NET MVC 3 模型中的虚拟目录?

swift - 正在获取 dyld : Library not loaded: @rpath/Alamofire. framework/Alamofire,原因:找不到图像

java - 桌面(非网络)应用程序中的 MVC 框架

c# - 根据满足的较低级别标准获取顶级实体

asp.net - 在 ASP MVC3 中,如何使用 uri 执行 Controller 和 Action ?

objective-c - xcode - 在框架和工作区之间共享代码

c# - Entity Framework 多对多不正确的表映射