在.NETStandard库项目中执行EFcore迁移

Fat*_*ent 5 entity-framework entity-framework-core .net-core .net-standard

我的问题基本上是:是否可以在.NET Standard 2.0库项目中使用Entity Framework Core(和迁移)?(不是核心项目)

我目前有2个项目:

  • ASP.NET Core主项目:在此项目中,我不需要数据库或EF,因此我添加了对.NETstandard2.0 DAL项目的引用

  • .NETStandard2.0数据访问层项目:具有数据库迁移功能的EF Core,用于访问数据库。主项目使用该项目从数据库中获取数据。

对于.NETStandard DAL项目,我使用以下设置和类:该.csproj文件包含EF和迁移的依赖项:

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
</ItemGroup>

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

调用后dotnet restore,我创建了一个DbContext后代:

class MyTestContext: DbContext
{
    public MyTestContext(DbContextOptions<MyTestContext> options) : base(options)
    {
    }

    public DbSet<Class1> Class1Table { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并增加了一个DbContextFactory具有IDesignTimeDbContextFactory这样的:

class DbContextFactory : IDesignTimeDbContextFactory<MyTestContext>
{
    public MyTestContext CreateDbContext(string[] args)
    {
        var builder = new DbContextOptionsBuilder<MyTestContext>();
        builder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=efmigrations2017;Trusted_Connection=True;MultipleActiveResultSets=true",
            optionsBuilder => optionsBuilder.MigrationsAssembly(typeof(MyTestContext).GetTypeInfo().Assembly.GetName().Name));

        return new MyTestContext(builder.Options);
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,到目前为止,一切正常,.NETStandard项目已成功构建。

现在,我想通过执行以下操作来创建我的第一个迁移:

dotnet ef migrations add InitialCreate
Run Code Online (Sandbox Code Playgroud)

这将引发错误: 在此处输入图片说明

如果我正确理解错误消息,EF Core只能在.NET Core和.NET Framework项目中使用,而不能在.NETStandard项目中使用吗?

如果是这样,如何将EF数据库逻辑与其他应用程序分开?

如果没有,如何使迁移工作?

先感谢您

bri*_*lam 5

您有两个选择。

一:将ASP.NET Core项目用作启动项目。

dotnet ef migrations add InitialCreate --startup-project ..\MyWebApplication
Run Code Online (Sandbox Code Playgroud)

二:类库中的跨目标.NET Core。(编辑*.csproj

<PropertyGroup>
  <!-- Note: This property name becomes plural. -->
  <TargetFrameworks>netcoreapp2.0;netstandard2.0</TargetFrameworks>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

  • 不需要入口点;是DLL。当NuGet为.NET Standard还原时,您得到的只是没有任何实际实现的参考程序集。但是,当NuGet还原ASP.NET应用程序的软件包时,它将为您提供可以执行的.NET Core DLL。.NET Standard只是一个规范,而不是运行时。 (2认同)