zoukankan      html  css  js  c++  java
  • EntityFrameWork简单使用介绍

    本篇是练习完微软官方例子后,对EntityFramework的总结。如果你是新手建议看下微软官方例子Getting Started with Entity Framework 6 Code First using MVC 5

    CodeFirst

    CodeFirst就是开发中,先不考虑数据库,直接根据领域模型建造业务实体,在通过持久将实体保存到数据库。利用EntityFramework可用很方便的实现CodeFirst。步骤如下

    1. 按照ef install-packages -entityframework
    2. 新建Model实体
    3. 实现DbContext作为当前数据上下文并配置文件webconfig添加connectionstrings,如果有多个类实现DbContext使用时需指明,(如果connectionstringskey值同数据上下文类名相同则会自动关联数据库,如不同重写构造函数)
    4. build,应用数据迁移enable-migrations可选参数ContextTypeName用于指明数据上下文类,运行会生成文件夹Migrations,可用定义填充数据
    5. add-migration 自定起名(最好具有对数据库更改有描述性)生成Model的修改对database的操作语句
    6. update-database将更新同步到数据库 在开发中对database多次修改可反复用 5-6

    实体间的关系的生成

    一些实体是相互关联的,那么怎么体现在Model和database上的呢?

    • 一对一:一个课程Course只属于一个办公室Department``Department的外键约束
    public class Course
    {
        public int DepartmentID { get; set; }
        public virtual Department Department { get; set; }
    }
    

    注意:反映在数据库表CourdeDepartmentID

    • 一对多:一个Department可有多个课程Course,则反映在导航属性上
    public class Department
    {
        public virtual ICollection<Course> Courses { get; set; }
    }
    

    Reading

    通过ef从database读取数据,DbSet<Student>实现了IQueryable<>,可以通过Linq或Lambda表达式查询,单实体查询:

    private SchoolContext db = new SchoolContext();
    var students = from s in db.Students
    						   select s;
    

    对包括关联其他Model的属性的查询

    • Lazy loading 当访问到属性字段时才发送sql,查询:

    • Eager loading 渴望加载,通过一条sql语句,将关联属性也查出,反映到sql时join语句

    注意可查看sql语句:departments.ToString();
    注意 这里通过include一次加载数据,关于include这里说点:如果一个实体的属性还包含实体怎么办?
    这里分情况看关联到的属性是个是集合:
    第一层是集合:query.Include(e => e.Level1Collection),
    两层非集合 query.Include(e => e.Level1Reference.Level2Reference),
    两层集合query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Reference))

    • Explicite Loading 同Lazy loading当属性访问时loading data。但需要手动指定。当Lazy Loading关闭时使用,Lazy Loading当序列化时会加载关联属性可能消耗比较大。

    数据保存

    在添加或删除都是通过SaveChanges保存到数据库

    • 单实体添加数据 db.Students.Add(student); db.SaveChanges();
    • 删除单个实体: db.Students.Remove(student); db.SaveChanges();
    • 更新:先通过ef查询到实体,修改数据再SaveChanges,当有关联属性时直接修改其值,添加关联集合通过add,删除通过remove 最后SaveChanges.
  • 相关阅读:
    [转]Magento刷新索引的几种方法
    [转]centos7 移动mysql5.7.19 数据存储位置
    [转]解决Magento批量导入带图片的商品的问题
    [转]【mysql监控】查看mysql库大小,表大小,索引大小
    [转]Centos系统中查看文件和文件夹大小
    [转]Magento 2.2 Developer Documentation
    [转]Magento2开发教程
    [转]Magento Configurable Product
    [转]论magento1和magento2的速度性能优化问题
    [转]本地 Windows 计算机密码登录 登录 腾讯云 Linux 实例
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/9647648.html
Copyright © 2011-2022 走看看