Включить миграцию с контекстом в отдельной сборке?
У меня есть один проект, который я хочу запустить мой update-database
против, но у меня есть мои модели и контекст в отдельном проекте.
Если я бегу enable-migrations
Я получаю эту ошибку: в сборке "MyProject" не найден тип контекста.
Это, вероятно, потому что мой контекст находится в MyProject.MVC.
Если я бегу enable-migrations
против MyProject.MVC я должен добавить файл конфигурации приложения. Я не хочу делать это, поскольку я хочу использовать код во многих проектах.
Так я могу бежать enable-migrations
против MyProject и как-то сказать ему искать в MyProject.MVC для контекста?
5 ответов
Это будет работать только в EF 6, но был релиз, который добавил -ContextProjectName
параметр к -enable-migrations
команда. С помощью этой команды вы можете сделать следующее:
enable-migrations -ContextProjectName MyProject.MVC -StartUpProjectName MyProject.MVC
-ContextTypeName MyProject.MVC.MyContextFolder.MyContextName -ProjectName MyProject
Это добавит миграции к вашему MyProject
проект с использованием контекста в MyProject.MVC
, Вы должны убедиться, что проект с миграциями имеет ссылку на проект с вашим контекстом, т. Е. MyProject
Рекомендации MyProject.MVC
Вы можете запускать "Enable-Migrations" только в проекте, содержащем класс Database Context.
Ваше решение будет содержать 2 проекта:
1) MyProject.Models
|- Migrations
|- 201401061557314_InitialCreate.cs
|- Configuration.cs
|- MyContext.cs
|- App.config (no connection string)
App.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
2) MyProject.MVC
|- Filters
|- InitializeSimpleMembershipAttribute.cs
InitializeSimpleMembershipAttribute.cs
namespace MyProject.MVC.Filters
{
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute
{
private static SimpleMembershipInitializer _initializer;
private static object _initializerLock = new object();
private static bool _isInitialized;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
// Ensure ASP.NET Simple Membership is initialized only once per app start
LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);
}
private class SimpleMembershipInitializer
{
public SimpleMembershipInitializer()
{
try
{
Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, MyProject.Model.Migrations.Configuration>());
using (var context = new MyContext())
{
context.Database.Initialize(force: true);
if (!context.Database.Exists())
{
// Create the SimpleMembership database without Entity Framework migration schema
((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
}
}
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
}
catch (Exception ex)
{
throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
}
}
}
}
}
Установите MyProject.MVC в качестве стартового проекта
В диспетчере пакетов выберите проект: MyProject.Models
Затем запустите "Enable-Migrations", чтобы создать папку "Migrations" в MyProject.Models.
Далее "Update-Database" -> миграции будут использовать строку подключения в Web.config из стартового проекта для выполнения миграции
Вот обходной путь:
Добавьте класс в MyProject(проект для миграций). Заставьте этот класс наследовать dbcontext(тот, что в MyProject.MVC).
Затем запустите команды миграции EF на MyProject.
установить Microsoft.EntityFrameworkCore.Tools для включения с помощью консоли диспетчера пакетов
У меня была такая же проблема, и я использую EntityFramework 4.3.1. Кажется, что EF6 решает эту проблему (согласно ответу @SOfanatic), но я не хотел обновляться до EF6 из-за некоторых критических изменений (в DataAnnotations, например).
Итак, что я сделал, чтобы решить это (и что я узнал в процессе):
Создайте новое решение (пустой проект) и добавьте проект, в котором у вас есть модель, для которой вы хотите включить миграцию (в вашем случае MyProject.MVC). Возможно, вам придется установить необходимые пакеты NuGet для него, прежде чем вы сможете добавить существующий проект.
Добавьте файл конфигурации со строкой соединения (не волнуйтесь, это только для обмана движка миграции). Скопируйте существующую базу данных в выходную папку проекта модели (в вашем случае это должен быть MVC\bin\Debug). Убедитесь, что строка подключения в файле конфигурации указывает на эту базу данных:
<connectionStrings> <add name="MyDB" providerName="System.Data.SqlServerCe.4.0" connectionString="DataSource=|DataDirectory|\MyDB.sdf"/> </connectionStrings>
Поскольку вы находитесь в новом решении, установите проект модели в качестве запускаемого проекта (вы можете удалить проект по умолчанию).
Запустите команду enable-migrations в консоли диспетчера пакетов. Он должен создать папку Migrations с двумя файлами: файлом Configuration.cs и файлом InitialCreate.cs с меткой времени. Приятно иметь InitialCreate, поэтому вы помещаете свою существующую базу данных в выходную папку проекта модели (но это не обязательно).
Перезагрузите исходное решение, чтобы эти изменения были обновлены.
Что я узнал (насколько я понимаю):
- Механизм миграции нуждается в чем-то, что выглядит как действительное соединение для работы. Я создавал строку подключения в коде (в другом проекте), и это не сработало. Я просто дал механизму миграции "правильную" строку подключения, чтобы он работал.
- Разместите свою базу данных там, где механизм миграции может ее найти (папка вывода проекта модели), чтобы она создала отправную точку для миграции. Эта отправная точка в основном представляет собой схему вашей базы данных, написанную в API миграции.
- Вы можете восстановить все до прежнего состояния после того, как миграция будет установлена, и она работает нормально.
- Каждый раз, когда вы хотите вручную добавить миграцию, вы должны снова "обманывать" механизм миграции, как в первый раз. Я не пробовал с автоматической миграцией, я думаю, этот подход тоже работает.
Кстати, я использую базу данных SQL Server CE 4.0, поэтому некоторые вещи в строке подключения имеют небольшой поворот по сравнению со стандартной базой данных SQL Server или LocalDB. Кроме того, все то же самое.
Надеюсь, что это полезно и дает вам некоторое представление. Пожалуйста, прокомментируйте, если вы знаете больше о том, как эта миграция работает.