.net 当使用模型优先方法时,如何为数据播种?

.net 当使用模型优先方法时,如何为数据播种?,.net,asp.net-mvc-3,entity-framework-4,seed,ef-model-first,.net,Asp.net Mvc 3,Entity Framework 4,Seed,Ef Model First,所以我正在学习MVC3和EF4。 我尝试了代码优先的方法,但它对我来说太混乱了。。我可以毫无问题地创建类,但是当处理外键和彼此之间的关系时,困难的部分来了 但我先选择了模特。通过这种方式,我可以直观地设计它,并查看它们之间的关系 在创建模型之后,它为我创建了一个SQL,我在SQL Express数据库中执行该SQL。完成了,完成了 现在我想在我的表中输入数据。当然,我可以使用服务器资源管理器将它们添加到服务器资源管理器中,但最有可能的是,我会在继续操作时对模型进行更改。并不断更新数据库。所以我不

所以我正在学习MVC3和EF4。 我尝试了代码优先的方法,但它对我来说太混乱了。。我可以毫无问题地创建类,但是当处理外键和彼此之间的关系时,困难的部分来了

但我先选择了模特。通过这种方式,我可以直观地设计它,并查看它们之间的关系

在创建模型之后,它为我创建了一个SQL,我在SQL Express数据库中执行该SQL。完成了,完成了

现在我想在我的表中输入数据。当然,我可以使用服务器资源管理器将它们添加到服务器资源管理器中,但最有可能的是,我会在继续操作时对模型进行更改。并不断更新数据库。所以我不能一直手动输入数据。我知道如果先使用代码,就可以派生
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"},
        };
    }
}
公共类数据库初始值设定项:IDatabaseInitializer{
public void InitializeDatabase(BettingContext上下文){
var团队=新列表{
新球队{Name=“多伦多枫叶队”,League=“NHL”},
新球队{Name=“Boston Bruins”,League=“NHL”},
新球队{Name=“温哥华加努克队”,League=“NHL”},
新球队{Name=“纳什维尔掠夺者”,League=“NHL”},
新球队{Name=“蒙特利尔加拿大人队”,League=“NHL”},
};
}
}
当然,在我的全局文件中:

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

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}
受保护的无效应用程序\u Start()
{
SetInitializer(新的DatabaseInitializer());
RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
注册地址(RouteTable.Routes);
}

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

你可以这样做:

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
{


}
在您的情况下,您可以尝试手动创建dbset(使用模型第一类),并尝试使用上面的代码插入它。它是模型优先+代码优先的混合

public class FourthCoffeeWebContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}
公共类FourthCoffeeWebContext:DbContext
{
公共数据库集类别{get;set;}
公共数据库集产品{get;set;}
}

除此之外:

模型优先与代码优先有很大不同,因为您在处理模型时,实际上是从模型生成数据库的。您可以使用SQL来创建数据库并手动运行它,因此我发现在这旁边保留一个包含种子数据的第二个SQL脚本是合乎逻辑的

如果我对模型进行了更改,SQL脚本就会更新,我当然需要检查我的种子SQL脚本(它方便地位于数据库创建脚本的旁边),我只需依次运行1


到目前为止,这种方法工作得很好,不会造成“这个数据加载器在哪里,它如何识别空数据库”的混淆。(我还可以在我的安装项目中包含这两个SQL脚本,以便执行自定义操作以使用种子数据创建数据库。)

我使用类似于以下内容的种子控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyProject.Models;

namespace MyProject.Controllers
{
    public class SeedController : Controller
    {
        public string Index()
        {
            ContactDBContext db = new Models.ContactDBContext();

            Person person = new Person();
            person.FullName = "Mr Test";
            person.Notes = "It's me!";
            db.People.Add(person);
            db.SaveChanges();
            return "Seeding complete.";
        }
    }
}

然后,在从模型实体图重新创建数据库后,只需导航到网站的“/Seed”url,它就会重新填充您的种子数据。

即使我使用模型优先而不是代码优先的方法,这是否有效?它如何知道模型是否已更改?它没有元数据表。@masfenix,有没有办法先在模型上初始化数据库?你找到解决办法了吗?我尝试了上面的方法,但数据库没有初始化。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyProject.Models;

namespace MyProject.Controllers
{
    public class SeedController : Controller
    {
        public string Index()
        {
            ContactDBContext db = new Models.ContactDBContext();

            Person person = new Person();
            person.FullName = "Mr Test";
            person.Notes = "It's me!";
            db.People.Add(person);
            db.SaveChanges();
            return "Seeding complete.";
        }
    }
}