• EF Code-First 学习之旅 Fluent API


    MappingsTo Database
    Model-wide Mapping
    • Set default Schema
    • Set Custom Convetions
    Entity Mapping
    • To Single or Multiple Tables and Schema
    • To Complex type
    • Inheritance Hierarchies
    Property Mapping
    • To Column, Column Name, Column Type, Nullable or Not Null Column, Column size, Columns Order
    • To Concurrency column
    • To Foreign key column
    • To configure relationships
    public class SchoolContext: DbContext 
    {
        public SchoolDBContext(): base() 
        {
        }
    
        public DbSet<Student> Students { get; set; }
        public DbSet<Standard> Standards { get; set; }
            
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //Configure domain classes using modelBuilder here
    
            base.OnModelCreating(modelBuilder);
        }
    }

    在OnModelCreating方法中配置Fluent API

    Code First配置优先顺序为:Fluent API > DataAnnotations > default conventions

    EntityTypeConfiguration

    EntityTypeConfiguration是一个重要的类,

    Method NameReturn TypeDescription
    HasKey<TKey> EntityTypeConfiguration 为实体类配置主键
    HasMany<TTargetEntity> ManyNavigationPropertyConfiguration 配置多对多的关系
    HasOptional<TTargetEntity> OptionalNavigationPropertyConfiguration

    配置从这个实体中可选的关系,这个实体的实例可以没有和关系就保存到数据库中,数据库中的外键可为nullable

    HasRequired<TTargetEntity> RequiredNavigationPropertyConfiguration

    配置从这个实体中必须的关系,实体的实例如果没有指定关系不能保存在数据库中,数据库外键为non-nullable

    Ignore<TProperty> Void 排除实体的属性不映射到数据库中
    Map EntityTypeConfiguration 允许与此实体类型映射到数据库架构的高级配置有关。
    Property<T> StructuralTypeConfiguration 配置在该类型上定义的结构属性
    ToTable Void 配置此实体类型映射到的表名。

    Entity Mappings

    public class Student
    {
        public Student()
        { 
            
        }
        public int StudentID { get; set; }
        public string StudentName { get; set; }
        public DateTime? DateOfBirth { get; set; }
        public byte[]  Photo { get; set; }
        public decimal Height { get; set; }
        public float Weight { get; set; }
            
        public Standard Standard { get; set; }
    }
        
    public class Standard
    {
        public Standard()
        { 
            
        }
        public int StandardId { get; set; }
        public string StandardName { get; set; }
        
        public ICollection<Student> Students { get; set; }
       
        }

    Configure Default Schema

    public class SchoolContext: DbContext 
    {
        public SchoolDBContext(): base() 
        {
        }
    
        public DbSet<Student> Students { get; set; }
        public DbSet<Standard> Standards { get; set; }
            
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //Configure default schema
            modelBuilder.HasDefaultSchema("Admin");
        }
    }

     配置实体映射到表

    namespace CodeFirst_FluentAPI_Tutorials
    {
            
        public class SchoolContext: DbContext 
        {
            public SchoolDBContext(): base() 
            {
            }
    
            public DbSet<Student> Students { get; set; }
            public DbSet<Standard> Standards { get; set; }
            
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                    //Configure default schema
                modelBuilder.HasDefaultSchema("Admin");
                        
                //Map entity to table
                modelBuilder.Entity<Student>().ToTable("StudentInfo");
                modelBuilder.Entity<Standard>().ToTable("StandardInfo","dbo");
    
            }
        }
    }

     

    配置实体到多个表中

    namespace CodeFirst_FluentAPI_Tutorials
    {
            
        public class SchoolContext: DbContext 
        {
            public SchoolDBContext(): base() 
            {
            }
    
            public DbSet<Student> Students { get; set; }
            public DbSet<Standard> Standards { get; set; }
            
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Student>().Map(m =>
                {
                    m.Properties(p => new { p.StudentId, p.StudentName});
                    m.ToTable("StudentInfo");
    
                }).Map(m => {
                    m.Properties(p => new { p.StudentId, p.Height, p.Weight, p.Photo, p.DateOfBirth});
                    m.ToTable("StudentInfoDetail");
    
                });
    
                modelBuilder.Entity<Standard>().ToTable("StandardInfo");
    
            }
        }
    }

     

    Property Mappings 

    public class SchoolContext: DbContext 
    {
        public SchoolDBContext(): base() 
        {
        }
    
        public DbSet<Student> Students { get; set; }
        public DbSet<Standard> Standards { get; set; }
            
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //Configure primary key
            modelBuilder.Entity<Student>().HasKey<int>(s => s.StudentKey);
            modelBuilder.Entity<Standard>().HasKey<int>(s => s.StandardKey);
    
            //Configure composite primary key
            modelBuilder.Entity<Student>().HasKey<int>(s => new { s.StudentKey, s.StudentName }); 
        }
    }
    public class SchoolContext: DbContext 
    {
        public SchoolDBContext(): base() 
        {
        }
    
        public DbSet<Student> Students { get; set; }
        public DbSet<Standard> Standards { get; set; }
            
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //Configure Column
            modelBuilder.Entity<Student>()
                        .Property(p => p.DateOfBirth)
                        .HasColumnName("DoB")
                        .HasColumnOrder(3)
                        .HasColumnType("datetime2");
        }
    }

     

    配置nullable和non-nullable

    namespace CodeFirst_FluentAPI_Tutorials
    {
            
        public class SchoolContext: DbContext 
        {
            public SchoolDBContext(): base() 
            {
            }
    
            public DbSet<Student> Students { get; set; }
            public DbSet<Standard> Standards { get; set; }
            
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                    //Configure Null Column
                modelBuilder.Entity<Student>()
                        .Property(p => p.Heigth)
                        .IsOptional();
                            
                    //Configure NotNull Column
                    modelBuilder.Entity<Student>()
                        .Property(p => p.Weight)
                        .IsRequired();
            }
        }
    }

    配置列的长度

    namespace CodeFirst_FluentAPI_Tutorials
    {
            
        public class SchoolContext: DbContext 
        {
            public SchoolDBContext(): base() 
            {
            }
    
            public DbSet<Student> Students { get; set; }
            public DbSet<Standard> Standards { get; set; }
            
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                //Set StudentName column size to 50
                modelBuilder.Entity<Student>()
                        .Property(p => p.StudentName)
                        .HasMaxLength(50);
                            
                //Set StudentName column size to 50 and change datatype to nchar 
                //IsFixedLength() change datatype from nvarchar to nchar
                modelBuilder.Entity<Student>()
                        .Property(p => p.StudentName)
                        .HasMaxLength(50).IsFixedLength();
                            
                //Set size decimal(2,2)
                    modelBuilder.Entity<Student>()
                        .Property(p => p.Height)
                        .HasPrecision(2, 2);
            }
        }
    }

    配置并发列

    namespace CodeFirst_FluentAPI_Tutorials
    {
            
        public class SchoolContext: DbContext 
        {
            public SchoolDBContext(): base() 
            {
            }
    
            public DbSet<Student> Students { get; set; }
            public DbSet<Standard> Standards { get; set; }
            
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                //Set StudentName as concurrency column
                modelBuilder.Entity<Student>()
                        .Property(p => p.StudentName)
                        .IsConcurrencyToken();
            }
        }
    }

    也可以用IsRowVersion()来配置byte[]数组 

  • 相关阅读:
    Python+MySQL学习笔记(一)
    MySQL的基本操作
    2016.08.15
    使用vue为image的src动态赋值
    json对象与json字符串的转化
    js三元运算符
    uniapp vue中的短信验证码
    设计模式
    回调函数
    自定义注解
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/6637697.html
Copyright © 2020-2023  润新知