zoukankan      html  css  js  c++  java
  • Entity Framework Code-First(16):Move Configurations

    Move Configurations to Separate Class in Code-First:

    By now, we have configured all the domain classes in OnModelCreating method in the previous sections. When you have a large number of domain classes, then configuring every class in OnModelCreating can become unmanageable. Code-First enables you to move all the configurations related to one domain class to a separate class.

    In the below example, we configured Student entity.

    public class SchoolDBContext: DbContext 
    {
        public SchoolDBContext(): base() 
        {
        }
    
        public DbSet<Student> Students { get; set; }
        public DbSet<Standard> Standards { get; set; }
        public DbSet<StudentAddress> StudentAddress { get; set; }
            
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
                modelBuilder.Entity<Student>().ToTable("StudentInfo");
                    
                modelBuilder.Entity<Student>().HasKey<int>(s => s.StudentKey);
                    
                modelBuilder.Entity<Student>()
                        .Property(p => p.DateOfBirth)
                        .HasColumnName("DoB")
                        .HasColumnOrder(3)
                        .HasColumnType("datetime2");
    
                modelBuilder.Entity<Student>()
                        .Property(p => p.StudentName)
                        .HasMaxLength(50);
                            
                    modelBuilder.Entity<Student>()
                        .Property(p => p.StudentName)
                        .IsConcurrencyToken();
                    
                modelBuilder.Entity<Student>()
                    .HasMany<Course>(s => s.Courses)
                    .WithMany(c => c.Students)
                    .Map(cs =>
                            {
                                cs.MapLeftKey("StudentId");
                                cs.MapRightKey("CourseId");
                                cs.ToTable("StudentCourse");
                            });
        }
    }

    Now, you can move all the configurations related to Student entity to a separate class which derives from EntityTypeConfiguration<TEntity>. Consider the following StudentEntityConfigurations class.

    public class StudentEntityConfiguration: EntityTypeConfiguration<Student>
    {
        public StudentEntityConfiguration()
        {
            
                this.ToTable("StudentInfo");
                    
                this.HasKey<int>(s => s.StudentKey);
                    
                    
                this.Property(p => p.DateOfBirth)
                        .HasColumnName("DoB")
                        .HasColumnOrder(3)
                        .HasColumnType("datetime2");
    
                this.Property(p => p.StudentName)
                        .HasMaxLength(50);
                            
                this.Property(p => p.StudentName)
                        .IsConcurrencyToken();
                    
                this.HasMany<Course>(s => s.Courses)
                    .WithMany(c => c.Students)
                    .Map(cs =>
                            {
                                cs.MapLeftKey("StudentId");
                                cs.MapRightKey("CourseId");
                                cs.ToTable("StudentCourse");
                            });
        }
    }

    As you can see above, we have moved all the configuration for the Student entity into constructor of StudentEntityConfiguration, which is derived from EntityTypeConfiguration<Student>. You need to specify entity type in a generic place holder for which you include configurations, Student in this case.

    Now, you can inform Fluent API about this class, as shown below.

    public class SchoolDBContext: DbContext 
    {
        public SchoolDBContext(): base() 
        {
        }
    
        public DbSet<Student> Students { get; set; }
        public DbSet<Standard> Standards { get; set; }
        public DbSet<StudentAddress> StudentAddress { get; set; }
            
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
                // Moved all Student related configuration to StudentEntityConfiguration class
                modelBuilder.Configurations.Add(new StudentEntityConfiguration());
                   
        }
    }

    Thus, you can use a separate class to configure a domain class to increase the readability and maintainability.

  • 相关阅读:
    仙人球的残影
    Calculate the formula
    自定义代码段
    getter-setter方法练习
    封装
    Xcode文档安装
    Xcode模板修改
    匿名对象
    OC多文件开发介绍
    #pragma mark指令
  • 原文地址:https://www.cnblogs.com/purplefox2008/p/5644338.html
Copyright © 2011-2022 走看看