加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – Entity Framework核心:无法添加迁移:无参数构造函数

发布时间:2020-12-15 19:28:26 所属栏目:百科 来源:网络整理
导读:我的数据项目参考:(实体框架核心) Project Sdk="Microsoft.NET.Sdk" PropertyGroup TargetFrameworknetcoreapp1.1/TargetFramework /PropertyGroup ItemGroup PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="1.1.1
我的数据项目参考:(实体框架核心)

<Project Sdk="Microsoft.NET.Sdk">    
      <PropertyGroup>
        <TargetFramework>netcoreapp1.1</TargetFramework>
      </PropertyGroup>    
      <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="1.1.1" />
        <ProjectReference Include="..Butv.CoreButv.Core.csproj" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.1" PrivateAssets="All" />      
        <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="1.0.0" />    
      </ItemGroup>
      <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />  
      </ItemGroup>
      <ItemGroup>
        <Folder Include="Migrations" />
      </ItemGroup>
    </Project>

数据库上下文:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
     public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { }

     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {  ....
     }
}
public class ApplicationUser : IdentityUser
{
}

每次我尝试命令

dotnet ef migrations add Init –verbose

,我收到了错误.在将Data项目与主项目分开之前,它已经习惯了.

Microsoft.EntityFrameworkCore.Design.OperationException: No parameterless constr
uctor was found on ‘ApplicationDbContext’. Either add a parameterless constructo
r to ‘ApplicationDbContext’ or add an implementation of ‘IDbContextFactory’ in the same assembly as ‘ApplicationDbContext’. —> System.Mi
ssingMethodException: No parameterless constructor defined for this object.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type,Boolean publicOn
ly,Boolean noCheck,Boolean& canBeCached,RuntimeMethodHandleInternal& ctor,Bo
olean& bNeedSecurityCheck)

解决方法

这与错误说的完全一样.您需要在DbContext类(您基本上不能这样做)上使用无参数构造函数,或者实现IDbContextFactory.

我使用的方法是创建IDbContextFactory的实现并从Create方法返回我的DbContext的实例,如下所示:

public class ApplicationDbContext : DbContext<ApplicationDbContext>
{
    // DbContext code as normal
}

public class ApplicationDbContextFactory : IDbContextFactory<ApplicationDbContext>
{
    public ApplicationDbContext Create(DbContextFactoryOptions options)
    {
        var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
        return new ApplicationDbContext(optionsBuilder.Options);
    }
}

请注意,您必须创建一个DbContextOptionsBuilder以传递给DbContext,但是由于迁移实际上并未访问数据库而只是读取您的实体类,我认为您不需要实际配置任何选项,除了可能的数据库提供程序,因为我已经遇到了生成的迁移代码问题,这些代码适用于一个提供商而不是另一个提供商

现在,当您运行迁移时,EF应自动查找Factory类并使用它来创建新的DbContext.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读