深爱那片海 发表于 2015-1-18 11:16:06

ASP.NET编程:Entity Framework 理论系列 ―― 弄好干系 - 同事之间(多对多,many-to-many)仓酷云 ...

一个很大的类库。应用程序之所以难以跨平台,在于直接调用了特定平台的接口,而一个巨大的类库,就能极大地减少应用程序对平台的依赖。从单相思(单向一对一)到两情相悦(双向一对一)到生儿育女(一对多),这是人生的一项任务——立室。
人生另有另外一项任务——立业。它不是一团体的事变,也不是两团体的事变,它必要良多同舟共济的人并肩作战。与你并肩作战的人叫作同事,同事之间的干系是双向的,你和他是同事,同时他和你也是同事,你有良多同事,你的同事也有良多同事。这就是“多对多”干系。
再回到博客的使用场景,文章(BlogPost)与分类(Category)之间也是“多对多”有干系:
一篇文章(BlogPost)能够属于多个分类,一个分类(Category)能够包括多篇文章。
类图:

BlogPost类的界说:

publicclassBlogPost
{
publicintID{get;set;}
publicstringTitle{get;set;}
publicintBlogID{get;set;}
publicvirtualBlogSiteBlogSite{get;set;}
publicvirtualICollection<Category>Categories{get;set;}
}

Category类的界说:
publicclassCategory
{
publicintID{get;set;}
publicstringTitle{get;set;}
publicvirtualICollection<BlogPost>BlogPosts{get;set;}
}
数据库表布局及干系:

BlogPost_Category是外键表,用于存储BlogPost与Category的多对多干系。
那我们怎样在EntityFramework中界说这类干系呢?请看代码:

modelBuilder.Entity<BlogPost>()
.HasMany(b=>b.Categories)
.WithMany(c=>c.BlogPosts)
.Map
(
m=>
{
m.MapLeftKey("BlogPostID");
m.MapRightKey("CategoryID");
m.ToTable("BlogPost_Category");
}
);

HasMany暗示一篇文章联系关系多个分类,WithMany暗示这些分类也分离联系关系着多篇文章。你有良多同事,你的同事也有良多同事。
ToTable("BlogPost_Category")暗示在BlogPost_Category表中找干系。
MapLeftKey("BlogPostID")与MapRightKey("CategoryID")暗示BlogPost要经由过程BlogPostID找到与本人有干系的人的CategoryID,然后再经由过程这个CategoryID找到这团体。Category与之相反。
使用场景测试
场景一:猎取一篇文章,并同时失掉它所属的分类
LINQ查询:
publicBlogPostGetBlogPost(intblogPostId)
{
return_blogPostRepository.Entities
.Include(p=>p.Categories)
.FirstOrDefault(p=>p.ID==blogPostId);
}
测试代码:


publicvoidGetBlogPost_Test()
{
varp=_aggBlogSiteService.GetBlogPost(1);
Assert.IsNotNull(p);
Console.WriteLine("BlogPost:"+p.Title);
Console.WriteLine("Categories:");
p.Categories.ToList().ForEach
(
c=>Console.WriteLine("Category:"+c.Title)
);
}

测试了局:

实践实行的SQL:

场景二:猎取一个分类,并失掉它所包括的文章
LINQ查询:
publicCategoryGetCategory(intcategoryId)
{
return_categoryRepository.Entities
.Include(c=>c.BlogPosts)
.FirstOrDefault(c=>c.ID==categoryId);
}
测试代码:


publicvoidGetCategory_Test()
{
varcategory=_aggBlogSiteService.GetCategory(1);
Assert.IsNotNull(category);
Console.WriteLine("Category:"+category.Title);
Console.WriteLine("BlogPosts:");
category.BlogPosts.ToList().ForEach
(
p=>Console.WriteLine("BlogPost:"+p.Title)
);
}

测试了局:

实践实行的SQL:

测试经由过程!
多对多干系看起来庞大,但只需处置好了,一点也不庞大。
就像同事干系,固然人愈来愈多,但只需方针分歧,同心合力,相处起来就很复杂。
竟发现没有太大的帮助。总觉得要用起来,感觉到不了位。因为公司机器的原因,一直没有安装vs.net(也从来没有用过)。以前做asp的时候一直用DW(感觉其代码联想功能不错),可现在到了asp.net却不习惯了。

只想知道 发表于 2015-1-20 18:56:42

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

小女巫 发表于 2015-1-25 10:05:14

在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。

小妖女 发表于 2015-1-27 16:30:18

ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。

深爱那片海 发表于 2015-2-11 07:32:27

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

蒙在股里 发表于 2015-2-14 19:54:27

Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。

因胸联盟 发表于 2015-3-4 10:01:36

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

若相依 发表于 2015-3-4 10:50:55

在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。

变相怪杰 发表于 2015-3-7 23:45:08

ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。

分手快乐 发表于 2015-3-11 03:36:55

虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。

活着的死人 发表于 2015-3-11 12:36:50

HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了.

飘飘悠悠 发表于 2015-3-18 11:14:48

它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
页: [1]
查看完整版本: ASP.NET编程:Entity Framework 理论系列 ―― 弄好干系 - 同事之间(多对多,many-to-many)仓酷云 ...