7

在使用 Entity Framework 4.3 的代码优先迁移时,我遇到了几个未处理的异常。

数据库上下文:

public class MyAppContext : DbContext
{
   public DbSet<Branch> Branches { get; set; }

   public MyAppContext()
   { }
}

实体:

public class Branch : IEntity<Guid>
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public bool Active { get; set; }
 }

数据库初始化器:

public class MyAppInitializer : CreateDatabaseIfNotExists<MyAppContext>
{
   protected override void Seed(MyAppContext context)
   {
      context.Branches.Add(new Branch() { Id = branchId, Name = "Acme", Description = "Acme", Active = true });
      context.SaveChanges();
   }
}

我使用以下方法将 Entity Framework 4.3 安装到我的 DAL 项目和 MVC 项目中:

安装包EntityFramework

我已将 MVC 项目设置为启动项目,并使用数据库上下文和初始化程序对 DAL 项目执行以下命令:

PM> 启用-迁移-详细

使用 NuGet 项目“Ckms.KeyManagement.Managers”。搜索上下文类型时出错(指定 -Verbose 以查看异常详细信息)。System.Data.Entity.Migrations.Design.ToolingException:无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。在 System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) 在 System.Data.Entity.Migrations.Design.ToolingFacade.GetContextTypes()
在 System.Data.Entity.Migrations.MigrationsCommands.FindContextToEnable() 编辑生成的配置类来指定启用迁移的上下文。为项目 Ckms.KeyManagement.Managers 启用了 Code First 迁移。

DbMigrationsConfiguration 子类被添加到 DAL 项目中。如果我手动添加 DbContext 的类型并启用自动迁移:

internal sealed class Configuration : DbMigrationsConfiguration<MyAppContext>
{
   public Configuration()
   {
      AutomaticMigrationsEnabled = true;
   }

   protected override void Seed(MyAppContext context)
   { }
}

Add-Migration 和 Update-Database 命令会引发以下异常:

PM> 添加迁移测试EFMigrationsColumn -Verbose

使用 NuGet 项目“Ckms.KeyManagement.Managers”。使用启动项目''。System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.ArgumentException:参数不正确。(来自 HRESULT 的异常:0x80070057(E_INVALIDARG))---内部异常堆栈跟踪结束---在 System.RuntimeType.InvokeDispMethod(字符串名称,BindingFlags 调用Attr,对象目标,对象 [] 参数,布尔 [] byrefModifiers,Int32 文化, String[] namedParameters) 在 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] 修饰符, CultureInfo 文化, String[] namedParams) 在 System.Management.Automation。 ComMethod.InvokeMethod(PSMethod 方法,

更新数据库:

PM>更新-数据库-详细

使用 NuGet 项目“Ckms.KeyManagement.Managers”。使用启动项目''。System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.ArgumentException:参数不正确。(来自 HRESULT 的异常:0x80070057(E_INVALIDARG))---内部异常堆栈跟踪结束---在 System.RuntimeType.InvokeDispMethod(字符串名称,BindingFlags 调用Attr,对象目标,对象 [] 参数,布尔 [] byrefModifiers,Int32 文化, String[] namedParameters) 在 System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] 修饰符, CultureInfo 文化, String[] namedParams) 在 System.Management.Automation。 ComMethod.InvokeMethod(PSMethod 方法,

有任何想法吗?错误消息并没有真正的帮助。我已经尝试过使用和不使用现有数据库的 Nuget 命令。

4

7 回答 7

12

如果您使用单独的库进行数据访问,则需要在运行查询时提供它的名称:

Add-Migration -StartUpProjectName "你的 DAL 项目" MyNewMigration

更新数据库-StartUpProjectName“您的 DAL 项目”-详细

于 2012-03-06T14:56:58.967 回答
4
add-migration -Name First -ProjectName DbSet.Framework -StartUpProjectName CodeFirstConsole

第一:迁移名称

Dbset.Framework:项目所在的dbContext等类

CodeFirstConsole:启动项目(可以是您的 Web、Windows 或控制台应用程序)

于 2012-05-17T17:28:29.053 回答
3

对于 System.ArgumentException:参数不正确。(来自 HRESULT 的异常:0x80070057 (E_INVALIDARG))添加 -projectname 和 startupprojectname 没有帮助。

将 PackageManager 控制台的“默认项目”下拉菜单设置为指向我想要“迁移文件夹”及其预期内容的库(在我的情况下),这是从多项目解决方案中运行它的唯一方法。

于 2014-03-19T16:37:19.593 回答
1

我也有同样的问题。发现如果配置文件有任何问题,则会出现此错误。我在 web.config 中有重复的标签,删除这些标签解决了我的问题。

于 2014-06-28T16:18:14.760 回答
1

我只能通过更改连接字符串中使用的名称来解决这个问题。

<add name="abcd" providerName="System.Data.SqlClient" connectionString="Data Source=.\SQLEXPRESS;AttachDbFileName=|DataDirectory|\DatabaseFileName.mdf;Integrated Security=True;User Instance=True;MultipleActiveResultSets=True" />

我在关闭标签后使用connectionStrings

appSettings

就在开始标签之前

system.web

确保您使用的名称connectionString未在其他连接中使用。

于 2018-08-10T06:18:42.713 回答
0

遇到同样的问题,通过<globalization>从 web.config 中删除解决。

于 2015-06-23T09:20:56.237 回答
0

您的网络中必须有两个连接字符串。配置文件。只删一个

于 2019-05-30T20:43:45.450 回答