实体框架代码优先迁移的例外情况

本文关键字:情况 迁移 框架 代码 实体 | 更新日期: 2023-09-27 18:26:45

在使用实体框架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();
   }
}

我使用将实体框架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(BaseRunnerrunner)System.Data.Entity.Migrations.Design.ToolingFacade.GetContextTypes()
在System.Data.Entity.Migrations.MigrationsCommands.FindContextToEnable()编辑生成的配置类以将上下文指定为为启用迁移。为项目Ckms.KeyManagement.Managers.启用代码优先迁移

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

internal sealed class Configuration : DbMigrationsConfiguration<MyAppContext>
{
   public Configuration()
   {
      AutomaticMigrationsEnabled = true;
   }
   protected override void Seed(MyAppContext context)
   { }
}

这些异常是为添加迁移和更新数据库命令抛出的:

PM>添加迁移测试EFMigrationsColumn-详细

使用NuGet项目"Ckms.KeyManagement.Managers"。正在使用启动项目"。System.Reflection.TargetInvocationException:已引发异常通过调用的目标。--->System.ArgumentException:参数不正确。(HRESULT中的异常:0x80070057(E_INVALIDARG))---内部异常堆栈跟踪结束---位于System.RuntimeType.IInvokeDispMethod(字符串名称,BindingFlagsinvokeAttr,Object target,Object[]args,Boolean[]byrefModifiers,Int32区域性,String[]namedParameters)System.RuntimeType.IInvokeMember(字符串名称,BindingFlagsbindingFlags,Binder Binder,Object target,Object[]providedArgs,ParameterModifier[]修饰符,CultureInfo区域性,String[]namedParams)System.Management.Automation.ComMethod.InvokeMethod(PSMethod方法,Object[]arguments)的目标引发了异常调用。

更新数据库:

PM>更新数据库-详细

使用NuGet项目"Ckms.KeyManagement.Managers"。正在使用启动项目"。System.Reflection.TargetInvocationException:已引发异常通过调用的目标。--->System.ArgumentException:参数不正确。(HRESULT中的异常:0x80070057(E_INVALIDARG))---内部异常堆栈跟踪结束---位于System.RuntimeType.IInvokeDispMethod(字符串名称,BindingFlagsinvokeAttr,Object target,Object[]args,Boolean[]byrefModifiers,Int32区域性,String[]namedParameters)System.RuntimeType.IInvokeMember(字符串名称,BindingFlagsbindingFlags,Binder Binder,Object target,Object[]providedArgs,ParameterModifier[]修饰符,CultureInfo区域性,String[]namedParams)System.Management.Automation.ComMethod.InvokeMethod(PSMethod方法,Object[]arguments)的目标引发了异常调用。

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

实体框架代码优先迁移的例外情况

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

添加迁移-StartUpProjectName"您的DAL项目"MyNewMigration

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

add-migration -Name First -ProjectName DbSet.Framework -StartUpProjectName CodeFirstConsole

第一个:迁移的名称

框架:dbContext和其他类所在的项目

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

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

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

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

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

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

遇到了同样的问题,通过从web.config中删除<globalization>解决了这个问题。。配置文件。只需删除一个