EF 4 Code First: с существующими таблицами - PullRequest
2 голосов
/ 18 января 2012

У меня есть существующая таблица в моей базе данных, и я хочу создать несколько дополнительных таблиц, используя Code First / Fluent API (каким бы способом вы ни захотели классифицировать его).Вот мое DbContext:

public class MyContext : DbContext
{
    public DbSet<Entity1> Entities1 { get; set; }
    public DbSet<Entity2> Entties2 { get; set; }

    public MyContext() : base(@"data source=....;")
    {}

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer(new MyContextInitializer());
        modelBuilder.Conventions.Remove<IncludeMetadataConvention>();

        modelBuilder.Configurations.Add(new Entity1Configuration());
        modelBuilder.Configurations.Add(new Entity2Configuration());
    }
}

Пройдя по некоторым вопросам здесь и некоторым постам в блоге, я нашел следующий способ, предложенный для создания несуществующих таблиц:

public class MyContextInitializer : CreateDatabaseIfNotExists<MyContext>
{
    protected override void Seed(MyContext context)
    {
        context.Database.ExecuteSqlCommand(_mainTable);
        context.Database.ExecuteSqlCommand(_relationTable);
        base.Seed(context);
    }
    private readonly string _mainTable=@"create table ...";
    private readonly string _relationTable=@"create table ...";
}

НоSeed метод в MyContextIntializer не вызывается, возможно, база данных уже существует.Если переместить операторы ExecuteSqlCommand в оператор OnModelCreating в MyContext, я получу следующую ошибку:

The context cannot be used while the model is being created.

Какие у меня есть другие варианты, кроме запуска SQL непосредственно в SQL Management Studio для создания таблиц?

Ответы [ 2 ]

1 голос
/ 18 января 2012

Описание

Я сделал то же самое несколько месяцев назад.

Вы можете сопоставить вашу модель с существующей базой данных.Скотт Гатри написал об этом в блоге.

Я рекомендую вам использовать Enity Framework Power Tools для создания моделей и контекста из существующей базы данных.

Дополнительная информация

Обновление

Youнеобходимо установить инициализатор для DbContext, если вы этого не сделаете, ваш новый инициализатор не будет использоваться.Выполните следующие действия при запуске приложения.

Database.SetInitializer<MyContext>(new MyContextInitializer());
0 голосов
/ 24 декабря 2013

Вы включили миграции? Если нет, то это вероятная причина. Если у вас есть папка Migrations, есть ли в этой папке файл конфигурации? Как выглядит конструктор? Вот как это должно выглядеть:

    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }
...