.net core 多项目中使用EFCore

类库一级项目使用.net core 3.1 框架
在这里插入图片描述
.net core 多项目中使用EFCore_第1张图片

其中EFCore是和数据库交互的
MultiCore 注入EFCore中的DBContext与数据库交互
主要为了解决多项目中数据库迁移失败问题

EFCore 工程安装如下包

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1TargetFramework>
    <Nullable>enableNullable>
  PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.10" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.10">
      <PrivateAssets>allPrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitiveIncludeAssets>
    PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.10">
      <PrivateAssets>allPrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitiveIncludeAssets>
    PackageReference>
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.10" />
  ItemGroup>

Project>

MultiCore 安装如下

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1TargetFramework>
  PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.10" />
  ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\EFCore\EFCore.csproj" />
  ItemGroup>


Project>

EFCore
person.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace EFCore.Entity
{
    public class Person
    {
        public int id { get; set; }

        public int age { get; set; }

        public string name { get; set; }
    }
}

personconfig.cs

using System;
using System.Collections.Generic;
using System.Text;
using EFCore.Entity;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace EFCore.EntityConfig
{
    internal class PersonConfig : IEntityTypeConfiguration<Person>
    {
        public void Configure(EntityTypeBuilder<Person> builder)
        {
            builder.ToTable("person");
        }
    }
}

EFDbcontext.cs

using EFCore.Entity;
using Microsoft.EntityFrameworkCore;
using System;

namespace EFCore
{
    public class EFDbContext:DbContext
    {
        public DbSet<Person> people { get; set; }
        public EFDbContext(DbContextOptions<EFDbContext> options)
            :base(options)
        {
            
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
        }
    }
}

EFDbContextFac .cs
这是关键,但是这仅仅在开发环境下使用,用户数据库迁移,生产不需要

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore;

namespace EFCore
{
    internal class EFDbContextFac : IDesignTimeDbContextFactory<EFDbContext>
    {
        public EFDbContext CreateDbContext(string[] args)
        {
            DbContextOptionsBuilder<EFDbContext> options = new DbContextOptionsBuilder<EFDbContext>();
            options.UseNpgsql(@"Host=localhost;Database=postgres;Username=postgres;Password=postgres");
            EFDbContext eFDbContext = new EFDbContext(options.Options);
            return eFDbContext;
        }
    }
}

此时将efcore设置为启动项就可以完成数据库迁移了(add-migration update-database)

在主工程中注册EFDbcontext即可


        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddDbContext<EFDbContext>(options =>
            {
                options.UseNpgsql(@"Host=localhost;Database=postgres;Username=postgres;Password=postgres");
            });
        }


你可能感兴趣的:(efcore,.netCore,.netcore,microsoft)