随笔 - 40  文章 - 1  评论 - 6  阅读 - 39976

自己编写 EntityTypeConfiguration

1.新建类库 EFCore.EntityTypeConfig ,安装nuget  PM> Install-Package Microsoft.EntityFrameworkCore

 

2.新建接口IEntityTypeConfiguration

复制代码
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Text;

namespace EFCore.EntityTypeConfig
{
  public  interface IEntityTypeConfiguration
    {
        void Map(ModelBuilder bulder);
    }
    public interface IEntityTypeConfiguration<T>:IEntityTypeConfiguration where T:class
    {
        void Map(EntityTypeBuilder<T> builder);
    }
}
IEntityTypeConfiguration
复制代码

新建类EntityTypeConfiguration.cs

复制代码
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Text;

namespace EFCore.EntityTypeConfig
{
   public abstract class EntityTypeConfiguration<T>:IEntityTypeConfiguration<T> where T:class
    {
        public abstract void Map(EntityTypeBuilder<T> builder);
        public void Map(ModelBuilder builder)
        {
            Map(builder.Entity<T>());
        }
    }
}
EntityTypeConfiguration.cs
复制代码

 

 新建类ModelBuilderExtenions.cs

复制代码
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace EFCore.EntityTypeConfig
{
    public static class ModelBuilderExtenions
    {
        private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface) {
            return assembly.GetTypes().Where(x => !x.GetTypeInfo().IsAbstract
            && x.GetInterfaces().Any(y => y.GetTypeInfo().IsGenericType
            && y.GetGenericTypeDefinition() == mappingInterface)); }

        public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
        {
            var mappingTypes = assembly.GetMappingTypes(typeof(IEntityTypeConfiguration<>));
               foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<IEntityTypeConfiguration>()) { config.Map(modelBuilder); }
        }
    }
}
ModelBuilderExtenions.cs
复制代码

 

3.控制台引用类库EFCore.EntityTypeConfig 

复制代码
using EFCore.EntityTypeConfig;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;

namespace ConsoleApp3
{
    public class MyDbContext:DbContext
    {
        public DbSet<Person> Persons { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            // modelBuilder.Entity<Person>().ToTable("T_Persons").Property(e => e.Id).IsRequired();
            // modelBuilder.Entity<Person>().ToTable("T_Persons") ;

            modelBuilder.AddEntityConfigurationsFromAssembly(Assembly.GetEntryAssembly());
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.UseMySql("Server=127.0.0.1;database=test;uid=root;pwd=123321");
        }
    }
}
复制代码

 

 

posted on   愚公学编程  阅读(3084)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示