MVC-CodeFirst(二)

MVC-CodeFirst(二)

DAL层

MyWebDbContext类

  需要定义一个继承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     }
View Code

  方法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&quot;"/>

  DbSet<>是数据库需要创建的表。

CompanyInitializer类

  该类,是初始化基础数据。在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     }
View Code

Migrations文件夹

  该文件夹主要存放每次数据库修改的记录。并在该文件夹下添加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 }
View Code

  其中Seed方法,是初始化基础数据的方法~

更新数据库

  如果数据结构需要修改,修改以后,打开“工具”的“Nuget程序包管理器”中的“程序包管理器控制台”,选择默认项目“DAL”,在PM>后面输入:Add-migration Initial,添加新的修改记录文件,再数据update-database更新数据库即可。

Codefirst结束

  到底,codefirst已经建立完成,很多地方写的比较粗糙,不过都是自己验证过,可以使用的,现在还在学习路由的配置,具体项目虽然已经有了,但是还有很多迷茫的地方,还在学习中~一边学习,一边记录吧~

原文地址:https://www.cnblogs.com/shadow-fei/p/4661709.html