2017-02-10 3 views
1

Я хочу, чтобы Entity Framework никогда не перезаписывала или не пыталась создать базу данных, к которой я подключаюсь. Это обычная база данных, к которой ранее обращался сайт ASP (визуальный базовый сценарий). Я видел соглашение, где вы проходите «имя =» в базовый конструктор, как так ...Рекомендации по инициализации Entity Framework

//example 1  
public class SchoolDBContext: DbContext 
{ 
    public SchoolDBContext() : base("name=SchoolDBConnectionString") 
    { 
    } 
} 

но я предпочел бы не иметь его HARDCODED (как выше), так что, возможно, ...

//example 2 
public SchoolDBContext(string ConnectionString) : base("name=" + ConnectionString) { 
} 

но я хотел бы также, чтобы быть в состоянии ошибки, если строка пуста ...

//example 3 
public SchoolDBContext(string ConnectionString) : { 
    if (string.IsNullOrWhitespace(ConnectionString) throw Exception("empty connection string"); 
    base("name=" + ConnectionString);   
} 

Вопрос 1: Я не уверен, если третий бит кода делает то же самое работа как вторая, не так ли? Поскольку третий пример может вызвать конструкцию без параметров сначала, прежде чем вызвать базу с именем «name =»

Вопрос 2: Доступны ли опции в конструкторе, которые могут быть использованы для более надежной настройки EntityFramework?

Я использую EF 6

ответ

1

Если вы не хотите EF перезаписать оч создать новую базу данных каждый раз, когда вам нужно добавить класс createinitializer.

public class CreateInitializer : CreateDatabaseIfNotExists<SchoolDBContext>{} 
+0

http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code- first.aspx ... CreateDatabaseIfNotExists: Это инициализатор по умолчанию. Как следует из названия, он создаст базу данных, если она не существует в соответствии с конфигурацией. Однако, если вы измените класс модели, а затем запустите приложение с этим инициализатором, тогда он будет генерировать исключение. – Nnoel

+0

Я отмечаю это правильно, потому что нашел свой ответ, перейдя по ссылке «CreateIntializer». Благодарю. – Nnoel

1

Вопрос 1:

Im не уверен, что либо. Должен признаться, я никогда не видел в примерах что-то подобное. Можете ли вы рассказать нам/мне свой источник документации или как вы пришли к этой идее?


Вопрос 2: Если вы wan't конструктор независимости, как насчет того, чтобы попробовать это?

public SchoolDBContext() 
     : base(ConnectionString == null ? "name=SchoolDBConnectionString" : WhateverYouDoIfItsWrong) 
    { 
     // Your code here! Lucky you 
    } 
+0

http://www.entityframeworktutorial.net/code-first/database-initialization-in-code-first.aspx – Nnoel

+1

@Nnoel ah okay. Ну, мой код такой же, как и ваш пример, но ... Я бы сказал, более плавный. – Cataklysim

+0

Я тоже использую это. +1 – Nnoel

1

Посмотрите на DbMigrationsConfiguration.

Вы можете создать класс ClassDbContextConfiguration нового класса, который наследует его и устанавливает значение AutomaticMigrationsEnabled в false.

internal sealed class Configuration : DbMigrationsConfiguration<SchoolDBContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
    } 
} 

И в ваших SchoolDbContext инициализировать следующим образом:

public SchoolDBContext(string ConnectionString) : base("name=" + ConnectionString) { 
var init = new MigrateDatabaseToLatestVersion<SchoolDBContext, SchoolDbContextConfiguration>(true); 
     Database.SetInitializer(init); 

}

+0

Спасибо за интересный ответ. +1 – Nnoel