自从4.1(现在我在4.3)以来,我一直在努力解决这个问题。在我看来,要调用种子方法,我应该做的就是以下内容:
1)在sqlserver上创建一个空数据目录 2)执行以下代码:
Database.SetInitializer(new DropCreateDatabaseAlways<SiteDB>());
我的SiteDB定义如下:
public class SiteDBInitializer :
DropCreateDatabaseAlways<SiteDB>
{
protected override void Seed(SiteDB db)
{
... (break point set here that never gets hit)
我觉得我必须遗漏一些非常简单的东西,因为这会创建我的表,但绝不会调用种子方法。
为了更清楚,这是一个包含所有代码的完整示例。当我运行它时,种子永远不会被调用:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Data.Entity;
namespace ConApp
{
internal class Program
{
private static void Main(string[] args)
{
Database.SetInitializer(new SiteDBInitializer());
using (var db = new SiteDB())
{
var x = db.Customers;
}
}
}
public class SiteDB : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
public class Customer
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public long Id { get; set; }
public string LastName { get; set; }
}
public class SiteDBInitializer :
DropCreateDatabaseAlways<SiteDB>
{
protected override void Seed(SiteDB db)
{
db.Customers.Add(new Customer() {LastName = "Kellner"});
db.Customers.Add(new Customer() {LastName = "Jones"});
db.Customers.Add(new Customer() {LastName = "Smith"});
db.SaveChanges();
}
}
}
答案 0 :(得分:8)
您需要致电Database.SetInitializer(new SiteDBInitializer());
。
答案 1 :(得分:0)
我查看了所有的答案,没有什么真正有效,我想知道如果DB不存在则不会调用Seed方法的微软错误。 唯一有效的代码是,如果DB不存在,实际上是让类调用种子:
上下文类:
class AlisDbContext : DbContext
{
public class MyContextFactory : IDbContextFactory<AlisDbContext>
{
public AlisDbContext Create()
{
return new AlisDbContext("CompactDBContext");
}
}
public AlisDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
Database.SetInitializer(new AlisDbInitializer(this));
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AlisDbContext>());
}
public DbSet<SavedCredentials> SavedCredentialses { get; set; }
}
然后AlisDbInitializer需要检查并调用种子方法,如:
public AlisDbInitializer(AlisDbContext alisDbContext)
{
if (!alisDbContext.Database.Exists())
{
Seed(alisDbContext);
}
}