EF 4.1 Code First и существующая база данных и членство в .NET - PullRequest
15 голосов
/ 28 марта 2011

У меня есть база данных с именем ApplicationName_Development, работающая на выпуске SQL Server 2008 R2 Developer в моей коробке разработки.

Я без проблем добавил в базу данных таблицы членства .NET.Когда я попытался заставить работать Code First, я получил следующее сообщение об ошибке:

Сервер обнаружил ошибку при обработке запроса.Сообщение об исключении: «Невозможно проверить совместимость модели, поскольку база данных не содержит метаданных модели. Убедитесь, что IncludeMetadataConvention была добавлена ​​в соглашения DbModelBuilder.

После некоторого поиска в Google я обнаружил, что мне пришлось удалитьбазы данных и позвольте EF создать базу данных. Это нормально, но я потерял все свои таблицы членства .NET. Я могу вернуться и снова добавить таблицы членства, но если моя модель изменится и EF потребуется воссоздать базу данных, тогда я должен добавитьтаблицы членства снова.

Как мне обойти это?

Ответы [ 6 ]

6 голосов
/ 28 марта 2011

Вот как работает код в первую очередь. Основная идея кода в первую очередь заключается в том, что вы не касаетесь своей базы данных, потому что ответственность за создание базы данных лежит на модели. Если вы хотите настроить свою базу данных, вы должны создать пользовательский IDatabaseInitializer и добавить свой собственный SQL.

public class MyDbInitializer : DropCreateDatabaseIfModelChanges<MyContext>
{
    protected override void Seed(MyContext context)
    {
        // Here run your custom SQL commands
        context.Database.ExecuteSqlCommand("CREATE TABLE ....");
    }
}

Теперь вам нужно только настроить инициализатор cutom при запуске приложения:

Database.SetInitializer<MyContext>(new MyDbInitializer());

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

5 голосов
/ 23 ноября 2011

Другим вариантом может быть использование пространства имен System.Web.Management.Я имел большой успех с кодом ниже:

string connectionString = ConfigurationManager.ConnectionStrings["MyDatabaseContext"].ConnectionString;
string database = "MyDatabaseName";
SqlServices.Install(database, SqlFeatures.All, connectionString);

Он просто создаст базу данных, и после этого вы сможете добавлять пользователей со стандартным API членства.

5 голосов
/ 05 апреля 2011

Найден более легкий обходной путь здесь.Надеюсь, это поможет.

http://www.paragm.com/ef-v4-1-code-first-and-asp-net-membership-service/

3 голосов
/ 27 апреля 2011

Вот еще одна возможность.

Если вы посмотрите на образец MvcMusicStore - есть класс SampleData, который отвечает за заполнение базы данных при перестроении. Класс SampleData наследуется от DropCreateDatabaseIfModelChanges и переопределяет метод Seed. Этот класс передается в Database.SetInitializer в методе Application_Start в global.asax.

Я получал ту же ошибку, что и вы, пока я не изменил родительский класс SampleData на CreateDatabaseIfNotExist.

Затем вы можете переопределить метод Seed, чтобы вставить любые данные, которые вы пожелаете при запуске, без сноса базы данных.

2 голосов
/ 06 сентября 2011

Во время разработки создайте 2 базы данных и две строки подключения. Один для SqlMembership (с использованием aspnet_regsql) и один для вашего EF-приложения. Если вы хотите объединить их в единую БД в производственном режиме, просто измените строку подключения в web.config.release, чтобы она была такой же. Затем изменения модели EF просто отбросят базу данных ваших приложений, а не базу данных вашего членства.

Обрабатывая компонент аутентификации отдельно, вы естественным образом отделите свою систему аутентификации от системы приложений. Тогда, если вы захотите сменить провайдера членства, вам будет лучше настроить.

По мере роста системы вам, вероятно, потребуется сначала поддерживать не чистые модели без кода EF, так что это хороший шаблон для перехода по этому пути.

0 голосов
/ 22 мая 2012

Я нашел самый простой способ, не играя ни с чем другим, заключался в следующем.

Я запустил приложение в первый раз с DropAndRecreatedatabase всегда в Initilizer.

Это создало мою базу данных в первый раз.

После этого я изменил это наDropCreateDatabaseIfModelChanges.

...