Ответ 1
Вместо этого вам нужно позвонить Database.SetInitializer(new SiteDBInitializer());
.
Я боролся с этой проблемой с 4.1 (теперь я на 4.3). Мне кажется, что для того, чтобы вызвать метод seed, все, что мне нужно сделать, это следующее:
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)
Мне кажется, что мне не хватает чего-то очень простого, потому что это создает мои таблицы, но никогда не вызывает метод seed.
Чтобы сделать это более понятным, вот полный пример, который включает весь код. Когда я запускаю его, семя никогда не вызывается:
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();
}
}
}
Вместо этого вам нужно позвонить Database.SetInitializer(new SiteDBInitializer());
.
Я смотрел на все ответы для этого, ничего действительно не работает, и мне интересно, не ошибка Microsoft для того, чтобы не вызывать метод 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);
}
}