zoukankan      html  css  js  c++  java
  • ASP.NET MVC4+EF4.1系列之二实体Code First

    前面我们已经能简单的建立起MVC4项目了,接下来在项目中添加一个类库,这个类库是用来建EF用的,它承担着MVC中Model层的作用。首先添加"ADO.NET实体数据模型",(我用的是简体中文版)虽然建立很简单但是照顾初学者就做了截图。

    这样就完成了EF的创建

    在前一篇已经说过通过一个小小的Demo去开始Code First。通过这个小例子进行简单的CRUD,首先开始创建实体。

    一、创建实体

    我很喜欢EF的图形化设计领域结构,实体设计如下图:

    很容易的看出来学生和成绩记录以下称成绩单和学生是1对多的关系,一个学生可以有多个成绩记录,因为每个课程都会有一个成绩记录,一个课程也可以有多次记录,所以我们不难发现学生和课程是一个多对多的关系,一个学生有对个课程,当然一个课程也可以同属于多个学生。

    二、写实体

    关系已经理清,我们就要去写这些实体。也许用过EF的大侠们都知道EF只要你将实体设计好,后台会自动生成类。但是在这里我不这样做,我不让它自动生成,我将EF的属性,代码生成策略改成“无”,如下图所示:

    大家注意画了红线的部分这样EF就不会在后台自动给我们生成代码了。那么大家会好奇,那我是不是要手动去写这些类和关系映射。答案是"NO"。这就是微软的强大了。我们用T4模板生成显示的实体代码。首先添加代码生成项

    在这里选中ADO.NET DbContext Generrator,也就是图上画红线的选项,大家也许记得我在前面说我我们要用到EF4.1的一些新特性。这里开始体现了。经过以操作实体已经生成。
    学生的实体:

    namespace MVC4School.Model
    {
        using System;
        using System.Collections.Generic;
        
        public partial class Student
        {
            public Student()
            {
                this.Performance = new HashSet<Performance>();
            }
        
            public System.Guid ID { get; set; }
            public string FirstName { get; set; }
            public string LastName { get; set; }
            public string StudentNum { get; set; }
            public System.DateTime CreateAt { get; set; }
            public string RecordTime { get; set; }
        
            public virtual ICollection<Performance> Performance { get; set; }
        }
    }
    

     你很容易看到其中成绩记录属性被virtual修饰,说明是延迟加载,这提高了性能,在EF中这个virtual不是必须的,不用visual在引用的是后也不会报错只是为null,也许了解nhibernate的同志知道这个在nhibernate中是必须的没有是会报错的。

    成绩记录的实体代码如下:

    namespace MVC4School.Model
    {
        using System;
        using System.Collections.Generic;
        
        public partial class Performance
        {
            public System.Guid ID { get; set; }
            public string Score { get; set; }
            public string CreatAt { get; set; }
        
            public virtual Student Student { get; set; }
            public virtual Course Course { get; set; }
        }
    }
    

     课程实体代码如下:

    namespace MVC4School.Model
    {
        using System;
        using System.Collections.Generic;
        
        public partial class Course
        {
            public Course()
            {
                this.Performance = new HashSet<Performance>();
            }
        
            public System.Guid ID { get; set; }
            public string Name { get; set; }
            public string CreatAt { get; set; }
        
            public virtual ICollection<Performance> Performance { get; set; }
        }
    }
    

     这样这三个实体的代码都完整的展现在我们的面前,但事实我们不用写一行代码,是不是很方便呢?(不要说我懒,有快捷的方式我为什么不用呢?)

    三、creating the  Database Context

    这个类主要将上面创建的类包含在其中,住要是指哪些实体包含在数据模型中,同时这个类指定我们创建的实体的映射关系,另一方面指定一些约束。

    自动生成的代码如下:

    View Code
     1 namespace MVC4School.Model
     2 {
     3     using System;
     4     using System.Data.Entity;
     5     using System.Data.Entity.Infrastructure;
     6     
     7     public partial class SchoolModelContainer : DbContext
     8     {
     9         public SchoolModelContainer()
    10             : base("name=SchoolModelContainer")
    11         {
    12         }
    13     
    14         protected override void OnModelCreating(DbModelBuilder modelBuilder)
    15         {
    16             throw new UnintentionalCodeFirstException();
    17         }
    18     
    19         public DbSet<Student> Students { get; set; }
    20         public DbSet<Course> Courses { get; set; }
    21         public DbSet<Performance> Performances { get; set; }
    22     }
    23 }

    这里我给一些简单的解说

            public SchoolModelContainer()
                : base("name=SchoolModelContainer")
            {
            }
    

     "name=SchoolModelConter"这个指定了连接字符串,这个连接字符串在App.config配置文件中,你打开这个文件会看到这样一段代码:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <connectionStrings>
        <add name="SchoolModelContainer" connectionString="metadata=res://*
    /SchoolModel.csdl|res://*/SchoolModel.ssdl|res://*/SchoolModel.msl;
    provider=System.Data.SqlClient;provider connection string='data source=.\SQLEXPRESS;
    attachdbfilename="C:\Documents and
     Settings\Administrator.9682B89E07F644F\My Documents\SchoolModel.mdf";integrated security=True;connect timeout=30;
    
    user instance=True;multipleactiveresultsets=True;App=EntityFramework'" 
    providerName="System.Data.EntityClient" />
      </connectionStrings>
    </configuration>
    

     这段连接字符串指定了数据库类型和连接字符串,忘了和大家说了,EF支持大部分流行数据库的。

    这样T4模板为我们做了所有的代码编写工作。下一节我给大家展示数据初始化和基本的CRUD。

    未完待续……

  • 相关阅读:
    iOS真机测试中出现dyld`dyld_fatal_error错误
    给WKWebView添加进度条(swift)
    手机号、密码正则判断
    Xcode8 上架前属性列表添加权限
    系统定位
    修改UISearchBar的背景颜色
    iOS 给NSString文字上添加横线 中间和下划线
    iOS UISearchBar 设置取消按钮,回收键盘,并修改cancel为“取消”
    iOS 支付宝第三方使用步骤
    UIImagePickerController和UIAlertController结合使用
  • 原文地址:https://www.cnblogs.com/egojit/p/MVC_EF2.html
Copyright © 2011-2022 走看看