【问题标题】:Exceptions for Entity Framework Code First Migrations实体框架代码优先迁移的例外情况
【发布时间】:2012-03-23 20:07:46
【问题描述】:

我在使用 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> Enable-Migrations -Verbose

使用 NuGet 项目“Ckms.KeyManagement.Managers”。 搜索上下文类型时出错(指定 -Verbose 以查看异常详细信息)。 System.Data.Entity.Migrations.Design.ToolingException:无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。在 System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner 亚军)在 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 invokeAttr,对象目标,Object[] args,Boolean[] byrefModifiers, Int32 文化,String[] namedParameters) 在 System.RuntimeType.InvokeMember(字符串名称,BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] 修饰符、CultureInfo 文化、String[] 命名参数)在 System.Management.Automation.ComMethod.InvokeMethod(PSMethod 方法, Object[] arguments) 的目标已抛出异常 调用。

更新数据库:

PM> 更新-数据库-详细

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

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

【问题讨论】:

    标签: c# entity-framework entity-framework-migrations


    【解决方案1】:

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

    Add-Migration -StartUpProjectName "Your DAL Project" MyNewMigration

    Update-Database -StartUpProjectName "Your DAL Project" -Verbose

    【讨论】:

    • 恐怕这并不能解决问题。如果我将 StartUpProjectName 参数添加到命令中,则会引发以下错误:System.Reflection.ReflectionTypeLoadException:无法加载一种或多种请求的类型。
    • 您在 dll 配置中是否有正确的设置。我的意思是配置部分,sql连接等。
    • 就是这样!我必须将 sql 连接添加到 DAL dll 的 app.config。请注意,-StartupProjectName 参数必须指向 MVC/ui 项目,而不是 DAL 项目。感谢您的帮助。
    • @AlexandervanTrijffel:如果此答案解决了问题,请单击投票数旁边的复选标记将其标记为已接受。
    • 我也遇到了同样的问题,能否请您更好地解释一下您是如何解决的?您在什么地方添加了 SQL 连接??
    【解决方案2】:
    add-migration -Name First -ProjectName DbSet.Framework -StartUpProjectName CodeFirstConsole
    

    名字:迁移名称

    Dbset.Framework:项目所在的dbContext和其他类

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 保罗,你能扩展一下吗?我也无法添加 -projectname 和 startupprojectname 并让它工作。你在哪里设置“默认项目”(在使用VS2013时我没有看到)。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我只是通过更改连接字符串中使用的 name 解决了这个问题。

        <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 中使用的name 未在其他连接中使用。

        【讨论】:

          【解决方案6】:

          遇到了同样的问题,通过从 web.config 中删除 &lt;globalization&gt; 解决了。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2013-12-29
              • 1970-01-01
              • 2017-10-31
              • 2013-01-02
              • 1970-01-01
              • 2013-06-14
              相关资源
              最近更新 更多