为什么启用迁移失败?

Why does enable-migration fail?

我今天早上安装了 Visual Studio 2015 社区版。之后我创建了一个新的 ASP.NET Web 应用程序并在 "ASP.NET 5 Preview Templates" 部分选择了 "Web Application" 模板。

项目创建后,我向解决方案(Class 库)添加了第二个项目,该项目应该包含我的所有实体(EF Code First)、业务对象、实用程序和其他核心内容。

Class 库使用 .NET Framework 4.5.2 并引用 EntityFramework 6.1.3。我还添加了 ASP.NET Identity 2.2.1(包括 EntityFramework 提供程序)。

在 App.config 我有这个连接字符串:

<connectionStrings>
    <add name="ApplicationDbContext" connectionString="Server=(localdb)\projectsv12;Database=myDB;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>

这里是对应的数据库上下文class:

public class ApplicationDbContext : IdentityDbContext<User> {

   public ApplicationDbContext() : base("name=ApplicationDbContext") { }

   public static ApplicationDbContext Create() {
    return new ApplicationDbContext();
   }

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    base.OnModelCreating(modelBuilder);
   }

   public System.Data.Entity.DbSet<Branch> Branches { get; set; }
   public System.Data.Entity.DbSet<Dimension> Dimensions { get; set; } 
}

如您所见,连接字符串的名称在 App.config 和 DbContext 构造函数中是相同的。我还设置了两个 POCO 实体并将它们添加到 DbContext(分支和维度)。

一切都应该为 "enable-migrations" 和 "update-database" 做好准备,因为我在 Visual Studio 2013 年已经做过几次了。

但是,在 Visual Studio 2015 年,我收到一条错误消息。这是我所做的:

  1. 我打开了包管理器控制台。
  2. 我在 "Default project" 下拉列表中选择了我的 Class 库项目。
  3. 我在命令提示符下输入了 "enable-migrations"(我还尝试了 EF7 附带的新 "add-migration" - 因为我的 Web 项目中引用了 EF7,所以我会试一试).

这是我收到的错误消息:

Exception calling "SetData" with "2" argument(s): "Type 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation.Package.Automation.OAProject' in assembly 'Microsoft.VisualStudio.ProjectSystem.VS.Implementation, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable." At C:\Tfs\Dev\primaVISTA\packages\EntityFramework.6.1.3\tools\EntityFramework.psm1:720 char:5 + $domain.SetData('startUpProject', $startUpProject) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : SerializationException System.NullReferenceException: Object reference not set to an instance of an object. at System.Data.Entity.Migrations.Extensions.ProjectExtensions.GetProjectTypes(Project project, Int32 shellVersion) at System.Data.Entity.Migrations.Extensions.ProjectExtensions.IsWebProject(Project project) at System.Data.Entity.Migrations.MigrationsDomainCommand.GetFacade(String configurationTypeName, Boolean useContextWorkingDirectory) at System.Data.Entity.Migrations.EnableMigrationsCommand.FindContextToEnable(String contextTypeName) at System.Data.Entity.Migrations.EnableMigrationsCommand.<>c__DisplayClass2.<.ctor>b__0() at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command) Object reference not set to an instance of an object.

有人知道我做错了什么吗?我错过了什么吗?或者这可能是由于 VS2015 中的错误?

非常感谢任何帮助!谢谢!!


按照 Sirwan 的建议,我打开了一个命令提示符,然后进入了我的库项目文件夹。这里我执行了添加迁移命令:

C:\Tfs\Dev\primaVISTA\src\primaVISTA.Core>dnx . ef migration add M1

System.InvalidOperationException: 无法从 C:\Tfs\Dev\primaVISTA\src\primaVISTA.Core 解析项目 'primaVISTA.Core' 在Microsoft.Framework.Runtime.ApplicationHostContext..ctor(IServiceProvider serviceProvider, String projectDirectory, String packagesDirectory, String configuration, FrameworkName targetFramework, ICache cache, ICacheContextAccessor cacheContextAccessor, INamedCacheDependencyProvider namedCacheDependencyProvider, IAssemblyLoadContextFactory loadContextFactory, Boolean skipLockFileValidation) 在 Microsoft.Framework.Runtime.DefaultHost.Initialize(DefaultHostOptions 选项,IServiceProvider hostServices) 在 Microsoft.Framework.Runtime.DefaultHost..ctor(DefaultHostOptions 选项,IServiceProvider hostServices) 在 Microsoft.Framework.ApplicationHost.Program.Main(字符串[] 参数) --- 从抛出异常的先前位置开始的堆栈跟踪结束 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Microsoft.Framework.Runtime.Common.EntryPointExecutor.Execute(Assembly assembly, String[] args, IServiceProvider serviceProvider) 在 dnx.host.Bootstrapper.RunAsync(List`1 args,IRuntimeEnvironment env,FrameworkName targetFramework) 在 dnx.host.RuntimeBootstrapper.ExecuteAsync(String[] args, FrameworkName targetFramework) 在 dnx.host.RuntimeBootstrapper.Execute(String[] args, FrameworkName targetFramework)

我不知道这是什么意思...

目前在 Visual Studio 2015 中不是这种情况,您应该在您的项目目录(而不是您的解决方案目录)中键入以下内容:

dnx . ef [options] [command]

要查看迁移命令可用的子命令,请键入 dnx . ef migration --help:

  • add – 添加新迁移

  • apply – 将迁移应用到数据库

  • list – 列出迁移
  • script – 从迁移
  • 生成一个SQL脚本
  • remove – 删除最后一次迁移

more info.

更新: 首先你必须设置你的环境:

  1. 打开一个新的命令提示符。
  2. 导航到 src[ProjectName] 目录。
  3. 运行 dnvm 升级以安装必要的 ASP.NET 5 个工具,如果还没有的话。
  4. 运行 dnu restore 加载项目所需的所有包。

然后运行这个命令:

dnx . ef migration add firstMigration
dnx . ef migration apply