为什么启用迁移失败?
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 年,我收到一条错误消息。这是我所做的:
- 我打开了包管理器控制台。
- 我在 "Default project" 下拉列表中选择了我的 Class 库项目。
- 我在命令提示符下输入了 "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
– 删除最后一次迁移
更新:
首先你必须设置你的环境:
- 打开一个新的命令提示符。
- 导航到 src[ProjectName] 目录。
- 运行 dnvm 升级以安装必要的 ASP.NET 5 个工具,如果还没有的话。
- 运行 dnu restore 加载项目所需的所有包。
然后运行这个命令:
dnx . ef migration add firstMigration
dnx . ef migration apply
我今天早上安装了 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 年,我收到一条错误消息。这是我所做的:
- 我打开了包管理器控制台。
- 我在 "Default project" 下拉列表中选择了我的 Class 库项目。
- 我在命令提示符下输入了 "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
– 删除最后一次迁移
更新: 首先你必须设置你的环境:
- 打开一个新的命令提示符。
- 导航到 src[ProjectName] 目录。
- 运行 dnvm 升级以安装必要的 ASP.NET 5 个工具,如果还没有的话。
- 运行 dnu restore 加载项目所需的所有包。
然后运行这个命令:
dnx . ef migration add firstMigration
dnx . ef migration apply