仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 895|回复: 10
打印 上一主题 下一主题

[学习教程] ASP.NET网页编程之Entity Framework - 理清干系 - 基于外键联系关系的单向一对一干系仓酷云 ...

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在VC.net的版本上,为了让C++运行在.NETFramework中,微软为C++引进了托管,就是托管C++(ManagedC++),这个根本就没有流行起来,自托管C++产生以后就没有收到过好评。注:本文针对的是EntityFrameworkCodeFirst场景。
之前写过三篇文章试图理清EntityFramework中的一对一干系(单相思(单向一对一),两情相悦(双向一对一),两情相悦-续),但事先理得不敷清,新的一年从头理一理。
事先“一对一”的实体干系,对应的数据库干系是外键联系关系(实践上是一种“一对多”干系,以是映照时用了WithMany)。而数据库中的“一对一”干系是共享主键(这是我团体的了解,不当的地方,接待指出),下篇文章将要理的就是这个干系。
因为双向“一对一”干系很罕用到,并且不保举利用,为了更分明地舆解,我们这里只谈单向一对一干系,也就是“基于外键联系关系的单向一对一干系(One-to-oneUnidirectionalrelationships)”,对应的之前的文章是单相思(单向一对一)。
1.类图

2.类的界说
  1. publicclassBlogSite{publicintBlogID{get;set;}publicstringBlogApp{get;set;}publicboolIsActive{get;set;}publicGuidUserID{get;set;}publicvirtualBlogUserBlogUser{get;set;}}
复制代码
  1. publicclassBlogUser{publicGuidUserID{get;set;}publicstringAuthor{get;set;}publicintBlogID{get;set;}}
复制代码
3.数据库布局

4.EnitityFramework映照干系界说
  1. protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){modelBuilder.Entity<BlogSite>().HasRequired(b=>b.BlogUser).WithMany();}
复制代码
怎样了解这里的HasRequired与WithMany呢?
我的了解是:HasRequired是针对BlogSite与BlogUser的干系,WithMany是针对BlogUser与BlogSite的干系。.HasRequired(b=>b.BlogUser).WithMany()暗示BlogSite与BlogUser存在Required联系关系干系(One-To-One,每个BlogSite都有一个对应的BlogUser),而这个联系关系对BlogUser来讲是One-To-Many(一个BlogUser能够有多个BlogSite)。
你大概会困惑?明显是单向一对一的实体干系,这里怎样弄出个一对多的干系?
假如有如许的困惑,属一般征象,我从客岁7月份写那篇文章入手下手困惑,一向困惑到如今,写篇文章时才有点弄分明。
注重,“单向一对一”是甚么?是实体干系;EntityFramework是甚么?是O/RM,是用来映照实体干系与数据库干系;还少了甚么?数据库干系。
从下面的图中的数据库布局能够看出,BlogSite与BlogUser之间是外键联系关系干系,上面的图能够更分明地看出这一点。

这个外键联系关系暗示的就是BlogUser与BlogSite之间是一对多的数据库干系。
总结一下:
实体干系——BlogSite与BlogUser之间的单向一对一
数据库干系——BlogUser与BlogSite之间的一对多
是否是如许呢?EntityFramework是否是也是如许以为的呢?我们来考证一下。
怎样晓得EntityFramework的设法呢?
经由过程EDM。
可这里是CodeFirst?
不论甚么First,都有EDM,由于这是EntityFramework的舆图,没有它,EntityFramework就会蒙头转向。CodeFirst的EDM是在EF运转时天生的,不是没有舆图,只是在EntityFramework的心中,我们看不到罢了。
怎样让EntityFramework说出内心话呢?
从MortezaManavi大家那学到一招,代码以下:
  1. using(varcontext=newContext()){XmlWriterSettingssettings=newXmlWriterSettings();settings.Indent=true;using(XmlWriterwriter=XmlWriter.Create(@"Model.edmx",settings)){EdmxWriter.WriteEdmx(context,writer);}}
复制代码
经由过程下面的代码,你就能够拿到EF心中的舆图——edmx文件。请看舆图:

公然,EF心中的舆图就是BlogUser与BlogSite的一对多干系。舆图的感化是甚么?是让EF经由过程舆图在数据库找到对应的数据。舆图是怎样发生的?是我们经由过程FluentAPI告知EntityFramework:.HasRequired(b=>b.BlogUser).WithMany()。
我们再来分析一下.HasRequired(b=>b.BlogUser).WithMany()。
之前,我一向被困扰,是由于老是把这里的界说看成实体的干系的界说。错!这里固然用的是实体举行界说,但界说的是实体与数据库中的数据之间的映照干系(这原本就是知识,居然被疏忽了),更多的是告知EF这些实体在数据库中的数据干系。EF终极是依据这个界说天生响应的SQL。
那我们从天生查询SQL的角度来了解一下:
.HasRequired(b=>b.BlogUser)告知EF,这是一个INNERJOIN查询(BlogSiteINNERJOINBlogUser);但INNERJOIN还必要前提,WithMany()告知EF这是一个外键联系关系,EF据此举行揣度,从BlogUser中找到主键UserID,并反省BlogSite中是不是存在名为UserID的属性,假如存在,就以此为外键举行查询。而我们的BlogSite中有UserID,因而天生上面的SQL:
  1. SELECT[Extent1].[BlogID]AS[BlogID],[Extent1].[BlogApp]AS[BlogApp],[Extent1].[IsActive]AS[IsActive],[Extent1].[UserID]AS[UserID],[Extent2].[UserID]AS[UserID1],[Extent2].[Author]AS[Author]FROM[dbo].[BlogSite]AS[Extent1]INNERJOIN[dbo].[BlogUser]AS[Extent2]ON[Extent1].[UserID]=[Extent2].[UserID]WHERE1=[Extent1].[IsActive]
复制代码
小结
理清“基于外键联系关系的单向一对一干系”,关头在于对modelBuilder.Entity<A>().HasRequired(A=>A.B).WithMany()的了解。
我再来了解一次:
.HasRequired(A=>A.B)暗示:1)实体A与实体B是一对一干系,实体A有一个导航属性A.B;2)在数据库中表A与表B存在一对一联系关系(INNERJOIN)。
.WithMany()暗示:1)实体B与实体A能够没有干系,也能够是一对多干系;2)在数据库中表A与表B存在外键联系关系。
下面满是我的团体了解,真正理清EntityFramework中的干系必要人人的力气,我只是抛个砖。
除“基于外键联系关系的单向一对一干系”,另有“基于共享主键的单向一对一干系”,这也是我们开辟中常常碰着的一种干系,好比博客文章(BlogPost)与文章内容(PostBody),旧事(NewsItem)与旧事内容(NewsBody)。下一篇文章将会理理这个干系。
我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:)
乐观 该用户已被删除
沙发
发表于 2015-1-20 20:38:52 | 只看该作者
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。
分手快乐 该用户已被删除
板凳
发表于 2015-1-28 05:17:44 | 只看该作者
通过这次激烈的讨论,我从大家身上学到了太多,开阔了眼界,不管是支持我的还是骂我的,都感谢你们。
飘飘悠悠 该用户已被删除
地板
发表于 2015-2-5 11:12:56 | 只看该作者
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
若天明 该用户已被删除
5#
发表于 2015-2-8 19:59:13 | 只看该作者
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-2-9 16:46:17 | 只看该作者
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。
若相依 该用户已被删除
7#
发表于 2015-2-27 11:50:28 | 只看该作者
平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。
第二个灵魂 该用户已被删除
8#
发表于 2015-2-28 11:00:09 | 只看该作者
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
海妖 该用户已被删除
9#
发表于 2015-3-6 21:19:32 | 只看该作者
Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!
金色的骷髅 该用户已被删除
10#
发表于 2015-3-13 09:11:11 | 只看该作者
那么,ASP.Net有哪些改进呢?
山那边是海 该用户已被删除
11#
发表于 2015-3-20 18:18:29 | 只看该作者
众所周知,Windows以易用而出名,也因此占据不少的服务器市场。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 00:20

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表