0

我首先使用实体​​框架代码,还有数据种子代码

现在,当我运行我的应用程序时,我的数据库会生成,但不会使用我的虚拟数据作为种子。我必须再次运行实体框架来填充所有数据。

知道为什么以及如何解决这个问题,这样我就不必运行我的应用程序 2x 来获取数据库和数据?

谢谢

我的上下文定义文件是:

 public class Context : DbContext
    {
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Agency> Agency { get; set; }

      protected override void OnModelCreating(DbModelBuilder modelBuilder)
     {
        base.OnModelCreating(modelBuilder);
     }
    }

这是我的种子文件

public class Configuration : DbMigrationsConfiguration<Context>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
        AutomaticMigrationDataLossAllowed = true;
    }

    protected override void Seed(Context context)
    {
        GenerateTasks(context);
        context.SaveChanges();
    }

    private static void GenerateTasks(Context context)
    {
        if (context.Task.Any()) return;
        context.Task.Add(new Task() { Name = "Received" });            
    }
}

创建数据库的钩子是:

  Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, Configuration>());
  var context = new Context();
  context.Database.Initialize(true);
4

2 回答 2

1

如果您的应用程序是ASP.NET并且是与数据层分开的程序集,那么您可以直接在 web.config 中配置它,而不是像以前那样配置初始化。也许这就是你的问题的原因。

因此,如果它是 ASP.NET 应用程序,您可以尝试以下操作:

(1)

注释掉这个:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context, Configuration>());
var context = new Context();
context.Database.Initialize(true);

(2)

在 web.config 中,在结束/configuration标记之前插入此权利:

<entityFramework>
<contexts>
  <context type="**fully-qualified name of your context class**,
                 **assembly name of your context**">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[**fully-qualified name of your context class**, **assembly name of your context**],
                               [**fully-qualified configuration type**, **assembly name of your context**, Version=1.0.0.0, Culture=neutral]], EntityFramework"/>
  </context>
</contexts>

其中完全限定的配置类型是具有您的迁移配置的类(类似于 [...]Context.Migrations.Configuration)

我在我的项目中为自己使用了这种配置方法,并且效果很好!

于 2012-05-30T18:27:01.363 回答
0

确实如此。调用context.Tasks.Find(1),然后它将访问数据库。EF 代码优先使用这个技巧来推迟每一件事。这样应用程序的启动时间似乎要快得多。(但实际上不是!)

于 2012-05-29T15:38:10.180 回答