小白学习之Code First(五)
Fluent API:另一种配置实体类的方式,它比DataAnnorations提供了更多的配置
其中EntityTypeConfiguration这个类提供了重要的属性、方法来配置对应的实体类,可以通过protected override void OnModelCreating(DbModelBuilder modelBuilder)的参数获取EntityTypeConfiguration<StudentInfo> studentInfoEntityConfig=new modelBuilder.Entity<StudentInfo>();列出其中一些方法:
HasEntitySetName:配置要用于此实体类型的实体集名称。 只能为每个集中的基类型配置实体集名称。
HasKey:配置此实体类型的主键属性。
HasMany:实体类型配置一对多关系。
HasOptional:实体类型配置可选关系。 实体类型的实例将能保存到数据库,而无需指定此关系。数据库中的外键可为 null。
HasRequired:配置必须的关系,如果配置关系,实体无法保存到数据库中,外键不能为空。
HasTableAnnotation:在实体映射到的表的模型中设置注释。 稍后可在处理表时(如创建迁移时)使用此注释值。
Ignore:从模型中排除某个属性,使该属性不会映射到数据库。
Map:允许与此实体类型映射到数据库架构的方式相关的高级配置。 默认情况下,任何配置都还会应用于从此实体类型派生的任何类型。
MapToStoredProcedures:将此类型配置为使用插入、更新和删除的存储过程。 将使用过程名称和参数名称的默认约定。
Property:配置在此类型上定义的属性。
ToTable:配置此实体类型映射到的表名。
实体:
1 public class StudentInf 2 { 3 public int SID { get; set; } 4 public string SName { get; set; } 5 public int Age { get; set; } 6 public string Address { get; set; } 7 public DateTime BirthDay { get; set; } 8 public ClassInf ClassInf { get; set; } 9 } 10 public class ClassInf 11 { 12 public int CID { get; set; } 13 public string CName { get; set; } 14 public virtual ICollection<StudentInf> StudentInfs { get; set; } 15 }
配置:
(图1)
(图2)
(图3)
1 public CSContext1():base("name=ConnStr") 2 { 3 } 4 public DbSet<ClassInf> ClassInfs { get; set; } 5 public DbSet<StudentInf> StudentInfs { get; set; } 6 protected override void OnModelCreating(DbModelBuilder modelBuilder) 7 { 8 EntityTypeConfiguration<StudentInf> SConfig = modelBuilder.Entity<StudentInf>(); 9 EntityTypeConfiguration<ClassInf> CConfig = modelBuilder.Entity<ClassInf>(); 10 //将实体映射成自定义名称的表 图1 11 //SConfig.ToTable("Student"); 12 //CConfig.ToTable("Class"); 13 //设置主键、复合主键 14 SConfig.HasKey(S => new {S.SID,S.SName}); 15 CConfig.HasKey(c => c.CID); 16 //拆分表 图2 17 //SConfig.Map(m => { 18 // m.Properties(p => p.ID); 19 // m.Properties(p => p.SName); 20 // m.ToTable("StudentMaster"); 21 //}).Map(m => { 22 // m.Properties(p => p.ID); 23 // m.Properties(p => p.Address); 24 // m.Properties(p => p.Age); 25 // m.Properties(p => p.BirthDay); 26 // m.ToTable("StudentDetial"); 27 //}); 28 //设置列属性 图3 29 SConfig.Property(s => s.Address).HasColumnName("地址").HasColumnOrder(5).HasColumnType("Nvarchar").IsUnicode(true).IsOptional().HasMaxLength(300); 30 //设置存储过程 图3 31 CConfig.MapToStoredProcedures(m => m.Update(u => 32 { 33 u.HasName("Class_procedure").Parameter(c => c.CName, "ClassName"); 34 })); 35 Database.SetInitializer(new DropCreateDatabaseIfModelChanges<CSContext1>()); 36 base.OnModelCreating(modelBuilder); 37 }
MapToStoredProcedures 上图中只自定义了Update的存储过程,而insert和Delete的存储过程自动生成默认的
1 static void Main(string[] args) 2 { 3 var context = new CSContext1(); 4 context.StudentInfs.ToList(); 5 Console.WriteLine("OK"); 6 Console.ReadKey(); 7 }