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

  • 相关阅读:
    Java n个线程轮流打印数字的问题
    【我所认知的BIOS】—&gt; uEFI AHCI Driver(6) AtaAtapiPassThruSupported的局部变量们
    设备树学习之(二)点灯【转】
    设备树学习之(一)GPIO中断【转】
    S5PV210开发板 VGA测试【转】
    Linux VGA驱动移植实验【转】
    略过天涯 深入浅出VGA和DVI接口【转】
    基于FPGA的VGA可移植模块终极设计【转】
    字符串函数---strcmp()与strncmp()详解及实现【转】
    关于内存中栈和堆的区别(非数据结构中的堆和栈,区别)
  • 原文地址:https://www.cnblogs.com/shadow-fei/p/4661709.html
Copyright © 2011-2022 走看看