начальный метод не вызывается с EntityFramework CodeFirst - PullRequest
15 голосов
/ 17 февраля 2012

Я боролся с этой проблемой с 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();
    }
}

}

Ответы [ 2 ]

8 голосов
/ 17 февраля 2012

Вам нужно позвонить Database.SetInitializer(new SiteDBInitializer());.

0 голосов
/ 05 сентября 2017

Я посмотрел на все ответы для этого, на самом деле ничего не работает, и мне интересно, если это ошибка 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 необходимо проверить и вызвать метод seed, например:

public AlisDbInitializer(AlisDbContext alisDbContext)
    {
        if (!alisDbContext.Database.Exists())
        {
            Seed(alisDbContext);
        }          
    }
...