zoukankan      html  css  js  c++  java
  • .net Core EF统一配置实体类型

    一般情况需要对某个实体进行一些配置时代码如下:

    protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                base.OnModelCreating(modelBuilder);
                modelBuilder.Entity<Product>().Property(p => p.Name).HasMaxLength(50).IsRequired();
            }

    如果按照上面代码对实体类型进行配置,当实体Entity特别多时难免不便于维护,如果能自动加载执行实体配置的相关类再好不过了

    以下代码即可实现统一加载实体配置类并执行

    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.EntityFrameworkCore.Metadata.Builders;
    using System.Reflection;
    using System.Linq;
    
    namespace DAL.Mapping
    {
        public interface IEntityMappingConfiguration
        {
            void Map(ModelBuilder b);
        }
    
        public interface IEntityMappingConfiguration<T> : IEntityMappingConfiguration where T : class
        {
            void Map(EntityTypeBuilder<T> builder);
        }
    
        public abstract class EntityMappingConfiguration<T> : IEntityMappingConfiguration<T> where T : class
        {
            public abstract void Map(EntityTypeBuilder<T> b);
    
            public void Map(ModelBuilder b)
            {
                Map(b.Entity<T>());
            }
        }
    
        public static class ModelBuilderExtenions
        {
            private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
            {
                return assembly.GetTypes().Where(x => !x.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(IEntityMappingConfiguration<>));
                foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<IEntityMappingConfiguration>())
                {
                    config.Map(modelBuilder);
                }
            }
        }
    }

    使用:

    using Entity.Table;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.EntityFrameworkCore.Metadata.Builders;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace DAL.Mapping
    {
        public class ProductConfiguration : EntityMappingConfiguration<Product>
        {
            public override void Map(EntityTypeBuilder<Product> b)
            {
                b.ToTable("Product", "HumanResources")
                    .HasKey(p => p.Id);
    
                b.Property(p => p.Name).HasMaxLength(50).IsRequired();
            }
        }
    }

    自动加载加载并执行继承了EntityMappingConfiguration的类达到统一对实体类型进行配置的目的

    protected override void OnModelCreating(ModelBuilder modelBuilder)
            {            
                base.OnModelCreating(modelBuilder);
                modelBuilder.AddEntityConfigurationsFromAssembly(GetType().Assembly);
            }

     参考:

    https://stackoverflow.com/questions/26957519/ef-core-mapping-entitytypeconfiguration#comment46244976_26957519
  • 相关阅读:
    阿里前端测试题--关于ES6中Promise函数的理解与应用
    elementUI之switch应用的坑
    vue函数同步执行遇到的问题
    阻止事件冒泡,阻止默认事件,event.stopPropagation()和event.preventDefault(),return false的区别
    关于Echarts的原生js获取DOM元素与动态加载DOM元素的冲突问题
    Linux 18.04 非root 安装re2c和ninja
    《Deep Learning of Graph Matching》论文阅读
    读书笔记《程序员的数学:概率统计》
    为什么要找特征向量?
    c++ 初始化
  • 原文地址:https://www.cnblogs.com/xiaoliangge/p/7657925.html
Copyright © 2011-2022 走看看