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却不习惯了。 网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项! 在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。 ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。 这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。 Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。 ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。 虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSPParser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(ScriptLanguage)版。 HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了. 它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
页:
[1]