zoukankan      html  css  js  c++  java
  • EntityFrameWork 实现实体类和DBContext分离在不同类库

    在新建EF的时候,选择CodeFirst,会生成一个DBContext类似于下图,这个还是只有一个实体Score的时候,如果项目中实体很多,整个放在DBcontxt里面会显示的非常凌乱,这个时候咱们可以接着反射和EntityTypeConfiguration<T>来对内容进行分割

     public partial class DBContext : DbContext
        {
            public DBContext()
                : base("name=DBContext")
            {
            }
    
            public virtual DbSet<Bird> Birds { get; set; }
          
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Birds>()
                    .Property(e => e.Id);
            }
        }

    这个时候,我们创建另外一个类库 TestEF.Data  在这个类库中,我们声明一个Map

    public partial class BirdMap
        {
            partial void BirdMapAppend()
            {
                ToTable("ZX_Bird", "dbo");
    
                this.Property(t => t.Id)
                   .HasColumnName("Id")
                   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
                   .IsRequired();
                this.Property(t => t.Name)
                    .HasColumnName("Name")
                    .IsRequired();
                this.Property(t => t.Age)
                    .HasColumnName("Age")
                    .IsRequired();
    
            }
        }
    public partial class BirdMap: EntityTypeConfiguration<Bird>
        {
            /// <summary>
            /// Module-数据表映射构造函数
            /// </summary>
            public BirdMap()
            {
                BirdMapAppend();
            }
    
            /// <summary>
            /// 额外的数据映射
            /// </summary>
            partial void BirdMapAppend();
    
            /// <summary>
            /// 将当前实体映射对象注册到当前数据访问上下文实体映射配置注册器中
            /// </summary>
            /// <param name="configurations">实体映射配置注册器</param>
            public void RegistTo(System.Data.Entity.ModelConfiguration.Configuration.ConfigurationRegistrar configurations)
            {
                configurations.Add(this);
            }
        }

    然后修改DBContext

        public class TestContext : DbContext
        {
            //您的上下文已配置为从您的应用程序的配置文件(App.config 或 Web.config)
            //使用“TestContext”连接字符串。默认情况下,此连接字符串针对您的 LocalDb 实例上的
            //“TestEF.TestContext”数据库。
            // 
            //如果您想要针对其他数据库和/或数据库提供程序,请在应用程序配置文件中修改“TestContext”
            //连接字符串。
            public TestContext()
                : base("name=TestContext")
            {
            }
    
            //public virtual DbSet<Bird> Birds { get; set; }
    
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                //modelBuilder.Entity<Bird>()
                //   .Property(e => e.Id);
    
                string assembleFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("TestEF.DLL", "TestEF.Data.DLL").Replace("file:///", "");
                Assembly asm = Assembly.LoadFile(assembleFileName);
                var typesToRegister = asm.GetTypes()
                .Where(type => !String.IsNullOrEmpty(type.Namespace))
                .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
                foreach (var type in typesToRegister)
                {
                    dynamic configurationInstance = Activator.CreateInstance(type);
                    modelBuilder.Configurations.Add(configurationInstance);
                }
                base.OnModelCreating(modelBuilder);
    
            }
    
    
         }

    这样我们通过反射,获取TestEF.DLL 里面的具有继承父类,并且父类为泛型类,并且泛型父类类型为 typeof(EntityTypeConfiguration<>)的类,进行注册,这样我们在DBContext文件里面就会很简洁,并且在BirdMap类中可以配置表信息,是否主键,属性长度等等约束

  • 相关阅读:
    获取指定包下所有自定义注解
    Java中的24种设计模式与7大原则
    学习 Spring Boot:(二十九)Spring Boot Junit 单元测试
    学习Spring Boot:(二十八)Spring Security 权限认证
    学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator
    学习Spring Boot:(二十六)使用 RabbitMQ 消息队列
    学习Spring Boot:(二十五)使用 Redis 实现数据缓存
    学习Spring Boot:(二十四)多数据源配置与使用
    学习Spring Boot:(二十三)Spring Boot 中使用 Docker
    学习Spring Boot:(二十二)使用 AOP
  • 原文地址:https://www.cnblogs.com/notyourdog/p/10511564.html
Copyright © 2011-2022 走看看