在数据库中,表与表之间可能存在多种联系,比如,一对多,多对多的关系。当我们使用逻辑外键在数据库建立两张表之间的关系的时候,我们使用EF实体框架

必然也会将这种关系映射到我们的实体关系中来。所以,在我们做项目的时候,很多情况下我们都使用逻辑外键建立两张表之间的关系,从而避免删除等操作带来的种

种问题。

那么,我们的EF实体框架是怎么解决这种关联关系呢?假如给我们两张表,一张是用户表,另外一张是订单表。用户表与订单表是一对多的关系,我们来仿照EF

代码简单的写一个自己的框架(CodeOnly)

第一步:建两个类UserInfo和Order类

下面这时UserInfo类:

 1 namespace codeOnly
2 {
3 public class UserInfo
4 {
5 [Key]
6 public int Id { get; set; }
7 public string UName { get; set; }
8 //这里显示了一对多的关系,一个用户可以有多个Order表
9 public ICollection<Order> Order { get; set; }
10 }
11 }

下面这是Order类

namespace codeOnly
{
public class Order
{
[Key]
public int Id { get; set; }
public string Content { get; set; }
//一个Order对应一个User
public UserInfo User { get; set; }
}
}

这样便解决了一对多的关系,多对多的实现也是如此,那么我们再来看看它的上下文的实现过程吧

 1 namespace codeOnly
2 {
3 public class DbContentDemo:DbContext
4 {
5 //实现了.Net与数据库的连接
6 public DbContentDemo()
7 : base("name=Demo")
8 {
9
10 }
11 public DbSet<UserInfo> UserInfo { get; set; }
12 public DbSet<Order> Order { get; set; }
13 }
14 }

看到这里,我们是不是就想起了HttpContext这个类呢,简直是具有异曲同工之处呢。前边也已经介绍了上下文的作用,这里就不再多说了,主要介绍一下其

中“name=Demo”的作用。在App.config下:Demo就是与数据库进行连接的字符串。所以它在内部实现了与数据库进行连接的操作。下面这段代码就可以实现在数

据库中创建与我们的实体一一对应的表格了。

 1 namespace codeOnly
2 {
3 class Program
4 {
5 public static void Main(string[] args)
6 {
7 DbContentDemo dbcontext = new DbContentDemo();
8 //初始化数据库
9 dbcontext.Database.CreateIfNotExists();//如果数据库不存在则自动创建
10 UserInfo user = new UserInfo();
11 user.Id = 5;
12 user.UName = "大家好";
13 dbcontext.SaveChanges();
14 Console.ReadKey();
15 }
16 }

上面这些代码颇为简单,相信大家都能看明白EF实体框架内部的处理过程是怎样的了(这是ModelFirst的情况),那么在DbFirst的情况下处理一对多多对多的关系

我们也简单的用一段小代码来诠释吧。

 1 namespace ModelFirstaaaa
2 {
3 class Program
4 {
5 static void Main(string[] args)
6 {
7 //一对多的关系
8 Model1Container dbContext=new Model1Container();
9 UserInfo user=new UserInfo();
10 user.ID = 5;
11 user.IsDel = "false";
12 user.Phone = "13363605745";
13 user.SubTime=DateTime.Now;
14 user.UName = "大家好";
15 dbContext.UserInfo集.AddObject(user);
16
17 Order order=new Order();
18 order.ID = 5;
19 order.Content = "你哈";
20 order.UserInfo = user;
21
22 dbContext.SaveChanges();
23 Console.WriteLine("执行成功");
24 Console.ReadKey();
25
26 //多对多的关系
27
28 #region 多对多的关系
29 Model1Container dbContext = new Model1Container();
30 UserInfo user = new UserInfo();
31 user.ID = 6;
32 user.IsDel = "false";
33 user.Phone = "13363605745";
34 user.SubTime = DateTime.Now;
35 user.UName = "me";
36 dbContext.UserInfo集.AddObject(user);
37
38 Order order = new Order();
39 order.Content = "你好";
40 order.ID = 7;
41 dbContext.Order.AddObject(order);
42
43 order.UserInfo.Add(user);
44 dbContext.SaveChanges();
45 Console.WriteLine("ok");
46 #endregion
47 }
48 }
49 }

另外,EF还有一个很优美的特定,那就是延迟加载的特性。EF       中第一个延迟加载机制:当我们用到的时候才会去加载数据。每次使用的时候都会全新为我们加

载数据。使用多少次便查询多少次      。当我们使用Linq表达式写一个查询语句的时候,返回的结果基本上都是一个       IQuerable       类型集合,数据库的sql执行的顺序一般为from,

where,select......而我们EF实体框架将程序编译成sql脚本的时候 先把执行的顺序根据算法生成树的形式(编译原理),根节点是       from,       先中间,后左边,然后最右边。

有可能继续      而我们       C#       提供的       Expression       类型就为我们提供了树的结构。我们写的       Linq       表达式最终只不过是将       Linq       生成了表达式放到了       Expression       表达式类型中去了。放到了

IQueryable       内部中去了。我们用到的       IQueryable       接口的集合的时候,       IQuerable       集合内部的       Provider       属性会解析       Expression,       然后生成相应的sql语句去做相应查询并加载数据。

1 var data = dbContext.ClassInfo.Where(c => c.ClassName.Contains("计算机"));
2 foreach (var classinfor in data)
3 {
4 Console.WriteLine(classinfor.ClassId+classinfor.ClassName);
5 }

2.第二种延迟加载机制:

导航属性的延迟加载机制:如果实体是查询出来的,那么通过导航属性去访问其它有关联的实体的时候       EF       会自动帮我们去查询关联表的数据。不管有没有       ToList,

导航属性      有个需求:缓存。       IQueryable       是一个非常特殊的接口,数据并不存放在本地,只有用到的时候通过       Provinder       去解析加载数据       (       它本身是不存储数据的       )       。而我们

List       ,       Array(实现了IEnumrable接口,可以对数组进行遍历)       都是一个本地集合      。Var  users=(from u in dbHmEntities select u).ToList();当查询成功的       时候就相

当于将数据库中的内容立刻加载到内存中,这时候使用       foreach       遍历集合的时候就不会去执行       sql       脚本了。       FirstOrDefault       也是立即去查询。

1     //IQueryable:是非常特殊的接口,数据并不存放在本地,只有用到的时候去解析Exp加载数据。
2 var data2 = dbContext.ClassInfo.Where(c => c.ClassName.Contains("计算机")).ToList();
3 foreach (var classinfo in data2)
4 {
5 Console.WriteLine(classinfo.ClassName+classinfo.ClassId);
6 }

EF实体框架处理实体之间关联关系与EF延迟机制(下)的更多相关文章

  1. ADO.NET EF实体框架

    ADO.NET 实体框架概述 随着.NET Framework 3.5 SP1和Visual Studio 2008 SP1的正式发布.ADO.NET 实体框架正式来到开发人员的面前,它使开发人员可以 ...

  2. ADO.NET实体框架Entity Framework模型-基于XML解析

            最近由于项目需求,需要对实体框架内表之间的关系进行处理,主要功能要求是通过一表名,返回其在实体框架内的所有关系表.主外键及每个字段的属性.先简单描述我解决这个问题从开始到最后的分析实现 ...

  3. .NET中微软实体框架的数据访问方法

    介绍 本文的目的是解释微软的实体框架提供的三种数据访问方法.网上有好几篇关于这个话题的好文章,但是我想以一个教程的形式更详细地介绍这个话题,这个教程对于开始学习实体框架及其方法的人来说是个入门.我们将 ...

  4. Entity Framework 学习总结之一:ADO.NET 实体框架概述

    http://www.cnblogs.com/xlovey/archive/2011/01/03/1924800.html ADO.NET 实体框架概述 新版本中的 ADO.NET 以新实体框架为特色 ...

  5. 【摘录】使用实体框架、Dapper和Chain的仓储模式实现策略

    以下文章摘录来自InfoQ,是一篇不错的软问,大家细细的品味 关键要点: Dapper这类微ORM(Micro-ORM)虽然提供了最好的性能,但也需要去做最多的工作. 在无需复杂对象图时,Chain这 ...

  6. Rafy 领域实体框架示例(1) - 转换传统三层应用程序

    Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三 ...

  7. 安装EF实体模型框架

    Data Access and Storage > 学习 > Entity Framework > 开始操作 > 空间 - EF 设计器 本视频和分步演练介绍如何使用实体框架设 ...

  8. EF实体框架之CodeFirst一

    对于SQL Server.MySql.Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Mo ...

  9. 实体框架 (EF) 入门 => 三、CodeFirst 支持的完整特性列表

    KeyAttribute 设置主键.如果为int类型,将自动设置为自增长列. 系统默认以Id或类名+Id作为主键.StringLengthAttribute 可设置最大最小长度以及验证提示信息等.最大 ...

随机推荐

  1. 更改Chrome浏览器安装位置的方法

    因为Google Chrome独特的优势,我们很多人都在使用它,但同时我们也会发现它是默认安装在我们的系统盘的,那么是否就不能修改其安装路径了呢?其实不然,这里介绍一种方法,亲测可行. 一.正常安装 ...

  2. Robots.txt 不让搜索引擎收录网站的方法

    有没有担心过自己的隐私会在强大的搜索引擎面前无所遁形?想象一下,如果要向世界上所有的人公开你的私人日记,你能接受吗?的确是很矛盾的问题,站长们大都忧虑“如何让搜索引擎收录的我的网站?”,而我们还是要研 ...

  3. 【Codechef】Chef and Bike(二维多项式插值)

    something wrong with my new blog! I can't type matrixs so I come back. qwq 题目:https://www.codechef.c ...

  4. Warning -27077: The "vuser_init" section contains web function(s) when the "Simulate a new user on each iteration" Run-Time Setting is ON.

    通过LR来录制登录过程并生成脚本,设置了自动关联,并回放录制脚本,观察回放日志发现没有报error信息,说明脚本没有问题,将脚本放入Controller中设置100个用户设置运行,发现运行一段时间开始 ...

  5. Dubbo中只订阅与只注册

    一:只订阅 1.场景 为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行. 可以让服务提供者开发方,只订阅服务(开发的服 ...

  6. ref:Mysql授权远程登陆

    ref:https://blog.csdn.net/qq_26710805/article/details/79776897 在Windows环境上操作.步骤如下: 1. 打开cmd窗口,登陆mysq ...

  7. Java 中类的初始化过程

    先来一张 JVM 中的内存模型 . 在Java 虚拟机原理这本书中介绍了类会被初始化的 5 种情况 . 1 遇到 new getstatic putstatic 和 invokestatic 这 4 ...

  8. 哪种写法更好?<script></script> vs/or <script type=”text/javasript”></script>

    一直很奇怪 哪种写法更好<script type=“text/javascript”>…</script> or <script>…</script>? ...

  9. iOS 9应用开发教程之多行读写文本ios9文本视图

    iOS 9应用开发教程之多行读写文本ios9文本视图 多行读写文本——ios9文本视图 文本视图也是输入控件,与文本框不同的是,文本视图可以让用户输入多行,如图2.23所示.在此图中字符串“说点什么吧 ...

  10. 使用 Python 读取火狐的 cookies

    这事本来是有个 browsercookie 库可以做的,但是初看它就有不少问题: 不能指定要使用的火狐 profile(后来发现可以指定数据库文件). 找不到 sessionstore.js 文件时会 ...