20

所以我正在学习 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"},
        };
    }
}

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

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

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

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

4

3 回答 3

13

模型优先与代码优先显着不同,因为您在处理模型时实际上是从模型生成数据库。您获得 SQL 来创建数据库并手动运行它,因此我发现将第二个 SQL 脚本与我的种子数据放在旁边是合乎逻辑的。

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

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

于 2012-05-11T11:17:14.643 回答
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
{


}

然后,在Application_Start()您内部调用:

Database.SetInitializer(new MySeedData());

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

public class FourthCoffeeWebContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
}

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

于 2011-05-15T02:48:42.327 回答
0

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

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”网址,它将重新填充您的种子数据。

于 2016-08-13T12:42:36.460 回答