|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
就安全性而言,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[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写出来,有两种写法,效果一样:
写法一(出自汉子之手):
- 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"));
复制代码 让我们测试一下,看看他们是不是真的两情相悦。测试代码以下:
- [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是:
- 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是:
- publicclassBlogUser{publicGuidUserID{get;set;}publicstringAuthor{get;set;}}0
复制代码
看到如许的SQL,你大概会叹息:为了两情相悦,支付这么年夜的价值,值得吗?
值得!今朝的价值只是临时的,两情相悦,通力合作,统统都能够改动!
这个SQL的成绩今朝还没找到办理办法,先放着,跟着博客园团队的发展,必定会办理这个成绩!
对于new隐藏成员的作用,往往是出于使用了一个第三方类库,而你又无法获得这个类库的源代码,当你继承这个类库的某个类时,你需要重新实现其中的一个方法,而又需要与父类中的函数使用同样的函数,这是就需要在自定义的子类中把那个同名函数(或成员)加上new标记,从而隐藏父类中同名的成员。 |
|