兰色精灵 发表于 2015-1-18 11:16:06

ASP.NET编程:Entity Framework 理论系列 ―― 弄好干系 - 生儿育女(一对多,one-to-many)仓酷云 ...

我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:)从单相思(单向一对一),到两情相悦(双向一对一)并步进婚姻殿堂,接上去就是生儿育女,汉子晋级为父亲,假如生了良多孩子,那父亲与孩子之间的干系就是“一对多”。
一个父亲有多个孩子,一个孩子只属于一个父亲。
我们仍是以博客为例,场景以下:
一个博客(BlogSite)有多篇文章(BlogPost),一篇文章只属于一个博客。
看类图:

看表布局:

BlogSite与BlogPost的界说代码:


publicclassBlogSite{publicintBlogID{get;set;}publicstringBlogApp{get;set;}publicboolIsActive{get;set;}publicGuidUserID{get;set;}publicvirtualBlogUserBlogUser{get;set;}publicvirtualICollection<BlogPost>BlogPosts{get;set;}}



publicclassBlogPost{publicintID{get;set;}publicstringTitle{get;set;}publicintBlogID{get;set;}publicBlogSiteBlogSite{get;set;}}

上面是关头一步,在EntityFramework的OnModelCreating中经由过程FluentAPI界说“一对多”干系:

modelBuilder.Entity<BlogSite>().HasMany(b=>b.BlogPosts).WithRequired(p=>p.BlogSite);
代码复杂直不雅,一个博客HasMany文章,一篇文章Require一个博客。
上面我们经由过程三个查询场景考证一下。
第一个场景:进进一个博客(BlogSite),并浏览博客中的一切文章(BlogPost)。
LINQ查询代码:

publicBlogSiteGetBlogSite(intblogId){return_blogSiteReposiotry.Entities.Include(b=>b.BlogPosts).FirstOrDefault(b=>b.BlogID==blogId);}
测试代码:


publicvoidGetBlogSite_Test(){varblogSite=_aggBlogSiteService.GetBlogSite(1);Assert.IsNotNull(blogSite);Console.WriteLine("BlogApp:"+blogSite.BlogApp);Console.WriteLine("BlogPosts:");blogSite.BlogPosts.ToList().ForEach(p=>Console.WriteLine(p.Title+"-"+p.BlogSite.BlogApp));}

测试了局:

实践实行的SQL:

这段SQL看似庞大,实践上SQLServer会在实行时举行优化,看实行企图就晓得了。
测试切合请求,经由过程!
第二个场景:浏览一篇文章(BlogPost),并要晓得来自哪一个博客(BlogSite)
LINQ查询代码:

publicBlogPostGetBlogPost(intblogPostId){return_blogPostRepository.Entities.Include(p=>p.BlogSite).FirstOrDefault(p=>p.ID==blogPostId);}
测试代码:


publicvoidGetBlogPost_Test(){varp=_aggBlogSiteService.GetBlogPost(1);Assert.IsNotNull(p);Console.WriteLine("BlogPostTitle:"+p.Title+","+"BlogApp:"+p.BlogSite.BlogApp);}

测试了局:

实践实行的SQL:

测试经由过程!
第三个场景:看良多文章(BlogPost),并要晓得每篇文章分离来自哪一个博客(BlogSite)
LINQ查询代码:

publicIEnumerable<BlogPost>GetAllBlogPosts(){return_blogPostRepository.Entities.Include(p=>p.BlogSite);}
测试代码:


publicvoidGetBlogPosts_Test(){_aggBlogSiteService.GetAllBlogPosts().ToList().ForEach(p=>Console.WriteLine("BlogPostTitle:"+p.Title+","+"BlogApp:"+p.BlogSite.BlogApp));}

测试了局:

实践实行的SQL:

轻松过关!
小结
HasMany+WithRequired,“一对多”干系简单了解,完成复杂,走的弯路也起码。
只需两情相悦了,统统都变得复杂,而最难的就是怎样从“单相思”到“两情相悦”。
net网页编程欺骗了我们那么多年,如今的多核时代,我认为它气数已尽!

变相怪杰 发表于 2015-1-18 16:47:25

我的意思是.net好用,从功能上来说比JAVA强还是很明显的。

小妖女 发表于 2015-1-22 13:10:32

但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。

admin 发表于 2015-1-23 11:51:12

ASP是把代码交给VBScript解释器或Jscript解释器来解释,当然速度没有编译过的程序快了。

若相依 发表于 2015-1-25 10:05:14

有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。

金色的骷髅 发表于 2015-1-27 05:07:44

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

精灵巫婆 发表于 2015-2-2 12:42:52

ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。

若天明 发表于 2015-2-7 19:35:10

在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?

小女巫 发表于 2015-2-23 08:22:25

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

老尸 发表于 2015-2-27 22:59:04

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。

蒙在股里 发表于 2015-3-9 15:05:56

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

愤怒的大鸟 发表于 2015-3-23 07:32:17

目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用CSharp(C#)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的WindowsNT/2000/XP+IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案.
页: [1]
查看完整版本: ASP.NET编程:Entity Framework 理论系列 ―― 弄好干系 - 生儿育女(一对多,one-to-many)仓酷云 ...