zoukankan      html  css  js  c++  java
  • entityframework学习笔记--005-给code first一个正确的解释

    在微软官方关于ef7的介绍中强调,ef7将舍弃database first、model first,只保留code first的使用。这引起了很多人的担忧,担忧源自对code first的错误理解。因为很多人认为code first是区别于database first与model first的第三种方式,其实这是错误的理解。其实code first是替代前两种方式的解决方案。换句话来说,Code First 不是相对 Database First 和Model First的第三种方式,而是一种可以替代EDMX文件格式的方案。从概念上讲,Code First 同时支持Database First和Model First工作方式。 这的确让人感到混乱,我们取错了名字。 或许叫它“基于代码建模(code-base modeling)”会更清晰些。这里有一篇关于ef7的介绍文档:https://msdn.microsoft.com/zh-cn/magazine/dn890367.aspx

    1.首先为你的项目安装上entityframework,然后右键你的项目,添加两个实体类文件,类文件信息如下:

     1 public class Class
     2     {
     3         public int Id { get; set; }
     4         public string Name { get; set; }
     5         public virtual List<Student> Students { get; set; }
     6         public Class()
     7         {
     8             Students = new List<Student>();
     9         }
    10     }
     1 public class Student
     2     {
     3         //[Key]
     4         public int Id { get; set; }
     5         public string Name { get; set; }
     6         public int ClassId { get; set; }
     7 
     8         //[ForeignKey("ClassId")]
     9         public virtual Class Class { get; set; }
    10     }

    1.2 在添加一个继承自DbContext的类,DbContext类是ef的数据访问核心。类信息如下:

     1 public class MyEfRecipesContext:DbContext
     2     {
     3         public MyEfRecipesContext()
     4         {
     5             //Database.SetInitializer(new CreateDatabaseIfNotExists<MyEfRecipesContext>());
     6         }
     7         public DbSet<Student> Students { get; set; }
     8         public DbSet<Class> Classs { get; set; }
     9 
    10         protected override void OnModelCreating(DbModelBuilder modelBuilder)
    11         {
    12             //这里可以用于模型创建前的配置修改
    13         }
    14     }

    上图中的注释代码是可以省略的,因为ef的默认配置就是这样。当然你可以手动更改配置信息。在ef中有一个原则“约定大于配置”,约定其实也就是默认配置,意思就是说ef中的约定最好不要主动去修改它。下面是ef的一些默认约定:

    (1) 数据库映射:Code First 默认会在本地的SQL Expression数据库中建立一个和DbContext的子类的全名相同的数据库,全名指的是命名空间加上类名。

    (2)表映射:Code First 默认会按照类型名复数建立数据表,比如说Student类对应的表名就叫Students.

    (3)列映射:Code First 默认会按照类中的属性名建立column,它还有默认的数据类型映射习惯,int会映射为interger,string会映射为nvarchar(max),decimal会映射为decimal(18,2)。后边会介绍如何更改column的名称,类型以及其他特性。

    (4)主键映射:Code First 默认会在类的属性中需找名字为Id或类型名称+Id的int类型的属性作为主键,并且是自增字段。这些也是可以改的。

    1.3 在App.config中添加配置文件,如果是Web程序配置文件则是Web.config,这个不用介绍了吧。连接字符串信息如下:

      <connectionStrings>
        <add name="MyEfRecipesContext" connectionString="Data Source=.;Initial Catalog=myefrecipes;User Id=sa;Password=renjing2000;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
      </connectionStrings>

    2.示例代码。新增与查询,输出见图5-1:

     1 using (MyEfRecipesContext db = new MyEfRecipesContext())
     2             {
     3                 Class c1 = new Class() { Name = "class1" };
     4                 Student s1 = new Student() { Name = "rj1", Class = c1 };
     5                 Student s2 = new Student() { Name = "rj2", Class = c1 };
     6 
     7                 db.Students.Add(s1);
     8                 db.Students.Add(s2);
     9                 int i = db.SaveChanges();
    10 
    11                 Console.WriteLine("id	姓名	班级");
    12                 foreach (var item in db.Students)
    13                 {
    14                     Console.WriteLine("{0}	{1}	{2}",item.Id,item.Name,item.Class.Name);
    15                 }
    16             }

    图5-1

    3.运行程序后,生成的表结构如图5-2。可以发现Students表月Classes表生成了“一对多”的关系,和我们的预期一样。“__MigrationHistory”是ef自动生成的一张表,主要用于ef的一些配置信息,可以不用关心。

     

    图5-2

  • 相关阅读:
    Asp.net性能优化总结(一)
    Visual C#常用函数和方法集汇总
    ASP.net下大文件上传的解决方案及WebbUpload组件源码
    正则表达式学习
    在Asp.net中为图像加入版权信息
    Cognos 维度函数
    Cognos8.3函数使用手册(二)
    cognos更新步聚
    Cognos8.3函数使用手册(一)
    Cognos 8 报表备份和恢复
  • 原文地址:https://www.cnblogs.com/renjing/p/codefirst.html
Copyright © 2011-2022 走看看