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

你可能感兴趣的:(first)