EF 4.1 Code First и существующая база данных и .NET Membership

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

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

Сервер обнаружил ошибку обрабатывая запрос. Исключение сообщение "Совместимость модели не может быть проверен, потому что база данных не содержат метаданных модели. обеспечивать что IncludeMetadataConvention имеет был добавлен в DbModelBuilder конвенции.

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

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

Ответы

Ответ 2

Вот как работает код. Основная идея кода в первую очередь заключается в том, что вы не трогаете свою базу данных, потому что это ответственность за создание базы данных. Если вы хотите настроить свою базу данных, вы должны создать пользовательский 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());

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

Ответ 3

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

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

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

Ответ 4

Здесь другая возможность.

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

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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