标签:
需要定义一个继承DbContext类的子类
1 public class MyWebDbContext : DbContext 2 { 3 //更新数据的命令: 4 //Add-migration Initial 5 //update-database 6 7 8 protected override void OnModelCreating(DbModelBuilder modelBuilder) 9 { 10 //modelBuilder.Configurations.Add(new DAL.EntitiesConfiguration.WorkRecordConfiguration()); 11 12 modelBuilder.Entity<Employee>().HasRequired(e=>e.ModifiedPerson) 13 .WithMany(e=>e.ModifiedPersonList) 14 .HasForeignKey(e=>e.ModifiedPersonId) 15 .WillCascadeOnDelete(false); 16 17 //base.OnModelCreating(modelBuilder); 18 modelBuilder.Configurations.Add(new WorkRecordConfiguration()); 19 } 20 21 public MyWebDbContext() 22 : base("DefaultConnection") 23 { 24 25 } 26 27 public DbSet<Employee> Employee { get; set; } 28 29 public DbSet<Job> Job { get; set; } 30 31 public DbSet<Enrollment> Enrollment { get; set; } 32 33 public DbSet<WorkRecord> WorkRecord { get; set; } 34 35 public DbSet<User> User { get; set; } 36 37 public DbSet<Contract> Contract { get; set; } 38 39 40 public void InsertDefaultData(MyWebDbContext content) 41 { 42 43 } 44 }
方法OnModelCreating中的modelBuilder,这个对象的Entity<>泛型方法来配置你的DbContext中的每个类的数据库映射。
配置Employee,定义了Employee中ModifiedPerson是不为空的,WillCascadeOnDelete是单项类映射,为什么其他属性不这样写呢?是因为Employee表中两个字段需要关联User表,如果没有该配置,会创建数据库失败~
1 modelBuilder.Entity<Employee>().HasRequired(e=>e.ModifiedPerson) 2 .WithMany(e=>e.ModifiedPersonList) 3 .HasForeignKey(e=>e.ModifiedPersonId) 4 .WillCascadeOnDelete(false);
第二个配置,这是我在某位大牛的文章中看到的,看的太多了,没找到具体是哪个,我就做了一个小例子,是成功的,所以就加上了,当时大牛的话,好像是如果将所有的配置都写在OnModelCreating方法中会很混乱,具体修改某个表时会很麻烦,所以就单独建立一个项目,或文件夹来单独配置每个表,这里我是单独建立了一个项目,就是MyWeb.EntitiesConfiguration,在该项目中,我只添加了一个类WorkRecordConfiguration,该类是对实体WorkRecord的配置,在构造里面是一个对字段WorkContent的配置,该字段的最大长度是45。这样就可以将每个表的配置,写在一个类中,比较清晰,同时易管理。然后在modelBuilder的配置文件中添加该类即可。
1 public class WorkRecordConfiguration : EntityTypeConfiguration<WorkRecord> 2 { 3 public WorkRecordConfiguration() 4 { 5 this.Property(w => w.WorkContent).HasMaxLength(45); 6 } 7 }
构造,定义了创建数据库的地址和名称,在文件App.config中的<connectionStrings>中添加名为“DefaultConnection”的配置
<add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="Data Source=localhost;Initial catalog=CompanyManage;uid=sa;pwd=123;Integrated Security=true;Pooling=False;MultipleActiveResultSets=True;App=EntityFramework""/>
DbSet<>是数据库需要创建的表。
该类,是初始化基础数据。在Job表和User表中分别添加三条数据~
1 /// <summary> 2 /// 初始化数据(IDatabaseInitializer 的实现,它仅在模型自数据库创建后发生更改时删除数据库、重新创建数据库并选择重新设置数据库的种子) 3 /// </summary> 4 public class CompanyInitializer : DropCreateDatabaseIfModelChanges<MyWebDbContext> 5 { 6 protected override void Seed(MyWebDbContext context) 7 { 8 try 9 { 10 var jobs = new List<Job> 11 { 12 new Job {JobName = "开发"}, 13 new Job {JobName = "运维"}, 14 new Job {JobName = "实施"}, 15 }; 16 jobs.ForEach(x => context.Job.Add(x)); 17 context.SaveChanges(); 18 19 var users = new List<User> 20 { 21 new User {UserName = "Doom"}, 22 new User {UserName = "DK"}, 23 new User {UserName = "NEC"}, 24 }; 25 26 users.ForEach(x => context.User.Add(x)); 27 context.SaveChanges(); 28 } 29 catch (Exception ex) 30 { 31 string exStr = ex.ToString(); 32 } 33 34 } 35 }
该文件夹主要存放每次数据库修改的记录。并在该文件夹下添加Configuration类
1 namespace DAL.Migrations 2 { 3 using System; 4 using System.Data.Entity; 5 using System.Data.Entity.Migrations; 6 using System.Linq; 7 8 internal sealed class Configuration : DbMigrationsConfiguration<DAL.MyWebDbContext> 9 { 10 public Configuration() 11 { 12 AutomaticMigrationsEnabled = true; 13 } 14 15 protected override void Seed(DAL.MyWebDbContext context) 16 { 17 context.InsertDefaultData(context); 18 } 19 } 20 }
其中Seed方法,是初始化基础数据的方法~
如果数据结构需要修改,修改以后,打开“工具”的“Nuget程序包管理器”中的“程序包管理器控制台”,选择默认项目“DAL”,在PM>后面输入:Add-migration Initial,添加新的修改记录文件,再数据update-database更新数据库即可。
到底,codefirst已经建立完成,很多地方写的比较粗糙,不过都是自己验证过,可以使用的,现在还在学习路由的配置,具体项目虽然已经有了,但是还有很多迷茫的地方,还在学习中~一边学习,一边记录吧~
标签:
原文地址:http://www.cnblogs.com/shadow-fei/p/4661709.html