我有一个项目要运行update-database
,但我将模型和上下文放在一个单独的项目中。
如果我运行enable-migrations
,我会收到此错误消息:
在程序集“MyProject”中找不到上下文类型。
这可能是因为我的Context在MyProject.MVC中。
如果我针对MyProject.MVC运行enable-migrations
,我必须添加一个应用配置文件。我不想这样做,因为我想在许多项目中使用代码。
那么我可以针对MyProject运行enable-migrations
并以某种方式告诉它在MyProject.MVC中查找上下文吗?
答案 0 :(得分:99)
这仅适用于EF 6,但有一个release将-ContextProjectName
参数添加到-enable-migrations
命令。通过使用此命令,您可以执行以下操作:
enable-migrations -ContextProjectName MyProject.MVC -StartUpProjectName MyProject.MVC
-ContextTypeName MyProject.MVC.MyContextFolder.MyContextName -ProjectName MyProject
这将使用MyProject
中的上下文向您的MyProject.MVC
项目添加迁移。
您需要确保具有迁移的项目具有对您的上下文的项目的引用,即MyProject
引用MyProject.MVC
答案 1 :(得分:12)
您只能在包含数据库上下文类的项目中运行“启用 - 迁移”。
您的解决方案将包含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
然后运行“启用 - 迁移”以在MyProject.Models中创建“迁移”文件夹
其次是“Update-Database” - &gt;迁移将使用启动项目中的Web.config中的连接字符串来执行迁移
答案 2 :(得分:3)
这是一种解决方法:
在MyProject(迁移项目)中添加一个类。使该类继承dbcontext(MyProject.MVC中的那个)。
然后在MyProject上运行EF迁移命令。
答案 3 :(得分:0)
我遇到了同样的问题,我使用的是EntityFramework 4.3.1。似乎EF6解决了这个问题(根据@SOfanatic的回答),但由于一些重大变化(例如在DataAnnotations中),我不想升级到EF6。
所以,我做了什么来解决这个问题(以及我在这个过程中学到的东西):
创建一个新的解决方案(空项目)并添加项目,其中包含要为其启用迁移的模型(在您的情况下为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很不错,这就是为什么将现有数据库放在模型项目的输出文件夹中的原因(但这是可选的)。
重新加载原始解决方案,以便更新这些更改。
我学到了什么(据我所知):
顺便说一句,我使用的是SQL Server CE 4.0数据库,因此与标准SQL Server DB或LocalDB相比,有关连接字符串的一些内容有点麻烦。除此之外,一切都是一样的。
希望这有用,并为您提供一些见解。如果您对迁移的工作方式有更多了解,请发表评论。