活着的死人 发表于 2015-1-18 11:16:06

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

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

BlogSite模样:


publicclassBlogSite{publicintBlogID{get;set;}publicstringBlogApp{get;set;}publicboolIsActive{get;set;}publicGuidUserID{get;set;}publicvirtualBlogUserBlogUser{get;set;}}

BlogUser模样:

publicclassBlogUser{publicGuidUserID{get;set;}publicstringAuthor{get;set;}}
OnModelCreating中的界说:

modelBuilder.Entity<BlogSite>().HasRequired(b=>b.BlogUser).WithMany().HasForeignKey(b=>b.UserID);
能够看出,如今的情况是BlogSite的心中有BlogUser,BlogUser的心中没有BlogSite。
要让两情相悦,只需BlogSite能感动BlogUser,让BlogUser心中有他。在实际天下这谈何简单,但在代码天下你能够为所欲为。我们能够先强行让BlogUser心中有BlogSite,代码以下:

publicclassBlogUser{publicGuidUserID{get;set;}publicstringAuthor{get;set;}publicvirtualBlogSiteBlogSite{get;set;}}
运转一下测试,看会产生甚么?
会不会是如许?BlogUser抽BlogSite两巴掌:“这些年你TMD逝世那里往了。。。”
代码天下可没有实际天下那样“暴力”,只是前往一个非常:

System.Data.SqlClient.SqlException:InvalidcolumnnameBlogSite_BlogID.
天生的SQL:


SELECT.AS,.AS,.AS,.AS,.AS,.AS,.ASFROM.ASINNERJOIN.ASON.=.LEFTOUTERJOIN.ASON.=.WHERE1=.

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

浸泡以后,即刻返来。
不要急于往找谜底,而是要先辈一步明白成绩,既然是弄干系,就要细心剖析一下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写出来,有两种写法,效果一样:
写法一(出自汉子之手):

modelBuilder.Entity<BlogSite>().HasRequired(b=>b.BlogUser).WithRequiredDependent(u=>u.BlogSite).Map(conf=>conf.MapKey("UserID"));
写法二(出自女人之手):

modelBuilder.Entity<BlogUser>().HasRequired(u=>u.BlogSite).WithRequiredPrincipal(b=>b.BlogUser).Map(conf=>conf.MapKey("UserID"));
让我们测试一下,看看他们是不是真的两情相悦。测试代码以下:


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是:


SELECT.AS,.AS,.AS,.AS,.AS,.ASFROM.ASLEFTOUTERJOIN(SELECT.AS,.ASFROM.ASLEFTOUTERJOIN.ASON.=.)ASON.=.LEFTOUTERJOIN(SELECT.AS,.ASFROM.ASLEFTOUTERJOIN.ASON.=.)ASON.=.WHERE1=.

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


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强还是很明显的。

若天明 发表于 2015-1-27 05:07:44

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。

透明 发表于 2015-1-30 13:29:42

CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。

若相依 发表于 2015-2-4 16:18:12

同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。

深爱那片海 发表于 2015-2-4 20:31:05

ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。

精灵巫婆 发表于 2015-2-5 02:31:13

Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。

莫相离 发表于 2015-2-6 15:53:41

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源

海妖 发表于 2015-2-7 17:57:35

网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!

活着的死人 发表于 2015-2-11 03:37:12

那么,ASP.Net有哪些改进呢?

山那边是海 发表于 2015-3-1 20:33:50

可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。

谁可相欹 发表于 2015-3-4 00:54:23

微软又推出ASP.NET。这不是ASP的简单升级,而是全新一代的动态网页实现系统,用于一台WEB服务器建立强大的应用程序。是微软发展的新体系结构.NET的一部分,是ASP和.NET技术的结合。

乐观 发表于 2015-3-7 06:28:18

大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。

小女巫 发表于 2015-3-14 12:36:45

Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。

飘灵儿 发表于 2015-3-21 07:49:26

弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
页: [1]
查看完整版本: ASP.NET编程:Entity Framework 理论系列 ―― 弄好干系 - 两情相悦(双向一对一)仓酷云 ...