仓酷云

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

[学习教程] ASP.NET编程:Entity Framework 理论系列 ―― 弄好干系 - 两情相悦(双向一对一)仓酷云 ...

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
就安全性而言,net网页编程已经远远低于VB.NET,更无法与安全性著称的C#相比。自从弄好了单向一对一干系,装满代码的心中塞进了挥之不往的情丝——单相思。谁都晓得音乐天下离不开情绪,可谁又晓得代码天下一样必要情绪。
单相思是星星之火,它存在的独一目标是扑灭两团体的天下。让我们紧握心中的火苗,入手下手两情相悦的征途吧。
先回忆一下单相思的场景:
BlogSite单相思BlogUser。

BlogSite模样:

  1. publicclassBlogSite{publicintBlogID{get;set;}publicstringBlogApp{get;set;}publicboolIsActive{get;set;}publicGuidUserID{get;set;}publicvirtualBlogUserBlogUser{get;set;}}
复制代码


BlogUser模样:
  1. publicclassBlogUser{publicGuidUserID{get;set;}publicstringAuthor{get;set;}}
复制代码
OnModelCreating中的界说:
  1. modelBuilder.Entity<BlogSite>().HasRequired(b=>b.BlogUser).WithMany().HasForeignKey(b=>b.UserID);
复制代码
能够看出,如今的情况是BlogSite的心中有BlogUser,BlogUser的心中没有BlogSite。
要让两情相悦,只需BlogSite能感动BlogUser,让BlogUser心中有他。在实际天下这谈何简单,但在代码天下你能够为所欲为。我们能够先强行让BlogUser心中有BlogSite,代码以下:
  1. publicclassBlogUser{publicGuidUserID{get;set;}publicstringAuthor{get;set;}publicvirtualBlogSiteBlogSite{get;set;}}
复制代码
运转一下测试,看会产生甚么?
会不会是如许?BlogUser抽BlogSite两巴掌:“这些年你TMD逝世那里往了。。。”
代码天下可没有实际天下那样“暴力”,只是前往一个非常:
  1. System.Data.SqlClient.SqlException:InvalidcolumnnameBlogSite_BlogID.
复制代码
天生的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],[Extent3].[BlogSite_BlogID]AS[BlogSite_BlogID]FROM[dbo].[BlogSite]AS[Extent1]INNERJOIN[dbo].[BlogUser]AS[Extent2]ON[Extent1].[UserID]=[Extent2].[UserID]LEFTOUTERJOIN[dbo].[BlogUser]AS[Extent3]ON[Extent1].[UserID]=[Extent3].[UserID]WHERE1=[Extent1].[IsActive]
复制代码


两情相悦切实其实不简单,刚想悦一下就被回绝了,并且是莫明的来由。
别气馁,办理成绩和追女孩一样,要有一种半途而废的精力。
别发急,先让本人静上去,来一杯咖啡,大概写写博客。。。让成绩在头脑中浸泡一会。。。

浸泡以后,即刻返来。
不要急于往找谜底,而是要先辈一步明白成绩,既然是弄干系,就要细心剖析一下BlogSite与BlogUser之间的干系。
看类图:

BlogSite有一个属性BlogUser,BlogUser有一个属性BlogSite;假设BlogSite是汉子,BlogUser是女人,那末经由过程这两个类的界说,我们晓得了(固然EF也晓得了)——汉子能够娶女人,但只能娶一个;女人能够嫁给汉子,但只能嫁一个。
看数据库表布局:

BlogSite表有个UserID字段对应BlogUser的UserID主键。以是,一个BlogSite找对应的BlogUser很简单,拿着本人晓得的UserID间接在BlogUser表中找出本人的另外一半;而一个BlogUser找对应的BlogSite就难一些,先经由过程本人的UserID在BlogSite表中找到对应的BlogID,然后经由过程BlogID找到对应的BlogSite。
打个例如,两情相悦的恋爱暗码躲在汉子内心,汉子一眼就可以看出属于本人的女人,而女人必要先找出汉子内心的恋爱暗码,然后看这个暗码是否是本人。难怪汉子要自动寻求女人。
别的,因为BlogSite表的UserID字段不克不及为空,以是汉子不克不及没有女人,也就是汉子依附(Dependent)女人;BlogUser表中没有BlogID,女人是配角(Principal),是等着汉子来寻求的。
经由过程上述的剖析,我们能够理出如许的干系:
汉子(BlogSite)必要(HasRequired)女人(BlogUser),女人也必要女人;汉子经由过程恋爱暗码(UserID)找到属于本人的女人,并依附她(WithRequiredDependent);女人经由过程恋爱暗码(UserID)断定她能够主宰(WithRequiredPrincipal)的汉子。
有了如许的干系形貌,我们能够在EF中经由过程FluentAPI写出来,有两种写法,效果一样:
写法一(出自汉子之手):
  1. modelBuilder.Entity<BlogSite>().HasRequired(b=>b.BlogUser).WithRequiredDependent(u=>u.BlogSite).Map(conf=>conf.MapKey("UserID"));
复制代码
写法二(出自女人之手):
  1. modelBuilder.Entity<BlogUser>().HasRequired(u=>u.BlogSite).WithRequiredPrincipal(b=>b.BlogUser).Map(conf=>conf.MapKey("UserID"));
复制代码
让我们测试一下,看看他们是不是真的两情相悦。测试代码以下:

  1. [TestMethod]publicvoidGetAllBlogSites_Test(){_aggBlogSiteService.GetAllBlogSites().ToList().ForEach(b=>{Console.WriteLine("BlogApp:"+b.BlogUser.BlogSite.BlogApp+",Author:"+b.BlogUser.BlogSite.BlogUser.Author);});}
复制代码


看看白色字体部分,测试的就是是不是“你中有我,我中有你”。
在测试之前,我们必要将恋爱暗码埋没,也就是把BlogSite的UserID属性正文失落。否则会呈现毛病——Eachpropertynameinatypemustbeunique.PropertynameUserIDwasalreadydefined.
运转测试,恋爱年夜磨练:


pass!恋爱测试经由过程,能够步进婚姻的殿堂。。。

相爱简单,相处难,婚姻生存才是对恋爱的真正磨练。
代码天下也是一样,测试经由过程了,但面前的代码是不是以我们希冀的体例运转呢?
翻开ServerServerProfiler,看个事实:
当我们猎取一个BlogSite列表时,实践实行的SQL是:

  1. SELECT[Extent1].[BlogID]AS[BlogID],[Extent1].[BlogApp]AS[BlogApp],[Extent1].[IsActive]AS[IsActive],[Join1].[UserID1]AS[UserID],[Join1].[Author]AS[Author],[Join3].[BlogID]AS[BlogID1]FROM[dbo].[BlogSite]AS[Extent1]LEFTOUTERJOIN(SELECT[Extent2].[UserID]AS[UserID1],[Extent2].[Author]AS[Author]FROM[dbo].[BlogUser]AS[Extent2]LEFTOUTERJOIN[dbo].[BlogSite]AS[Extent3]ON[Extent2].[UserID]=[Extent3].[UserID])AS[Join1]ON[Extent1].[UserID]=[Join1].[UserID1]LEFTOUTERJOIN(SELECT[Extent4].[UserID]AS[UserID2],[Extent5].[BlogID]AS[BlogID]FROM[dbo].[BlogUser]AS[Extent4]LEFTOUTERJOIN[dbo].[BlogSite]AS[Extent5]ON[Extent4].[UserID]=[Extent5].[UserID])AS[Join3]ON[Extent1].[UserID]=[Join3].[UserID2]WHERE1=[Extent1].[IsActive]
复制代码


当我们猎取一个BlogUser列表时,实践实行的SQL是:

  1. publicclassBlogUser{publicGuidUserID{get;set;}publicstringAuthor{get;set;}}0
复制代码


看到如许的SQL,你大概会叹息:为了两情相悦,支付这么年夜的价值,值得吗?
值得!今朝的价值只是临时的,两情相悦,通力合作,统统都能够改动!
这个SQL的成绩今朝还没找到办理办法,先放着,跟着博客园团队的发展,必定会办理这个成绩!
对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。
再现理想 该用户已被删除
沙发
发表于 2015-1-20 18:56:42 | 只看该作者
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
蒙在股里 该用户已被删除
板凳
发表于 2015-1-24 15:35:44 | 只看该作者
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
飘飘悠悠 该用户已被删除
地板
发表于 2015-1-25 18:26:31 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
若天明 该用户已被删除
5#
发表于 2015-1-27 05:07:44 | 只看该作者
ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。
透明 该用户已被删除
6#
发表于 2015-1-30 13:29:42 | 只看该作者
CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。
若相依 该用户已被删除
7#
发表于 2015-2-4 16:18:12 | 只看该作者
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
深爱那片海 该用户已被删除
8#
发表于 2015-2-4 20:31:05 | 只看该作者
ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。
精灵巫婆 该用户已被删除
9#
发表于 2015-2-5 02:31:13 | 只看该作者
Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。
莫相离 该用户已被删除
10#
发表于 2015-2-6 15:53:41 | 只看该作者
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
海妖 该用户已被删除
11#
发表于 2015-2-7 17:57:35 | 只看该作者
网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!
活着的死人 该用户已被删除
12#
 楼主| 发表于 2015-2-11 03:37:12 | 只看该作者
那么,ASP.Net有哪些改进呢?
山那边是海 该用户已被删除
13#
发表于 2015-3-1 20:33:50 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
谁可相欹 该用户已被删除
14#
发表于 2015-3-4 00:54:23 | 只看该作者
微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。
乐观 该用户已被删除
15#
发表于 2015-3-7 06:28:18 | 只看该作者
大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。
小女巫 该用户已被删除
16#
发表于 2015-3-14 12:36:45 | 只看该作者
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
飘灵儿 该用户已被删除
17#
发表于 2015-3-21 07:49:26 | 只看该作者
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 21:35

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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