使用Model First方法时如何种子数据?

mas*_*nix 20 .net seed entity-framework-4 asp.net-mvc-3 ef-model-first

所以我正在学习MVC3和EF4.我尝试了第一个代码方法,但它对我来说太混乱了.我可以创建类没有问题,但是在处理外键和彼此之间的关系时会遇到困难.

但我先把模特带走了.通过这种方式,我可以直观地设计它并查看关系的位置.

在我的模型创建之后,它为我创建了一个SQL,我对我的SQL Express数据库执行该操作.做完了.

现在我想要表格中的数据.当然我可以使用服务器资源管理器添加它们,但很可能我会在进行时对模型进行更改.并不断更新数据库.所以我无法手动输入数据.我知道如果您首先使用代码,您可以派生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"},
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,在我的全局文件中:

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

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)

那么现在怎么办?如何告诉它运行该方法?我究竟做错了什么?

Vin*_*met 13

模型优先与Code First有很大不同,因为您在处理模型时实际从模型生成数据库.您可以使用SQL来创建数据库并手动运行它,因此我发现使用我的种子数据将第二个SQL脚本放在旁边是合乎逻辑的.

如果我对模型进行更改,则SQL脚本会更新,我当然需要查看我的种子SQL脚本(它位于我的数据库创建脚本旁边),我只是一个接一个地运行.

到目前为止,这种方法一直运行良好,并没有造成"这个数据加载器在哪里以及如何识别空数据库"的混淆.(我也可以在我的安装项目中包含这两个SQL脚本,以便我自定义操作以使用种子数据创建数据库.)


Len*_*rri 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
{


}
Run Code Online (Sandbox Code Playgroud)

然后,在Application_Start()你打电话:

Database.SetInitializer(new MySeedData());
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以尝试手动创建DbSets(使用您的模型第一类)并尝试使用上面的代码插入它.它是Model First + Code First的混合体.

public class FourthCoffeeWebContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

添加到:CreateDatabaseIfNotExists <(Of <(<'TContext>)>)>