|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在VC.net的版本上,为了让C++运行在.NETFramework中,微软为C++引进了托管,就是托管C++(ManagedC++),这个根本就没有流行起来,自托管C++产生以后就没有收到过好评。注:本文针对的是EntityFrameworkCodeFirst场景。
之前写过三篇文章试图理清EntityFramework中的一对一干系(单相思(单向一对一),两情相悦(双向一对一),两情相悦-续),但事先理得不敷清,新的一年从头理一理。
事先“一对一”的实体干系,对应的数据库干系是外键联系关系(实践上是一种“一对多”干系,以是映照时用了WithMany)。而数据库中的“一对一”干系是共享主键(这是我团体的了解,不当的地方,接待指出),下篇文章将要理的就是这个干系。
因为双向“一对一”干系很罕用到,并且不保举利用,为了更分明地舆解,我们这里只谈单向一对一干系,也就是“基于外键联系关系的单向一对一干系(One-to-oneUnidirectionalrelationships)”,对应的之前的文章是单相思(单向一对一)。
1.类图
2.类的界说- publicclassBlogSite{publicintBlogID{get;set;}publicstringBlogApp{get;set;}publicboolIsActive{get;set;}publicGuidUserID{get;set;}publicvirtualBlogUserBlogUser{get;set;}}
复制代码- publicclassBlogUser{publicGuidUserID{get;set;}publicstringAuthor{get;set;}publicintBlogID{get;set;}}
复制代码 3.数据库布局
4.EnitityFramework映照干系界说- protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){modelBuilder.Entity<BlogSite>().HasRequired(b=>b.BlogUser).WithMany();}
复制代码 怎样了解这里的HasRequired与WithMany呢?
我的了解是:HasRequired是针对BlogSite与BlogUser的干系,WithMany是针对BlogUser与BlogSite的干系。.HasRequired(b=>b.BlogUser).WithMany()暗示BlogSite与BlogUser存在Required联系关系干系(One-To-One,每个BlogSite都有一个对应的BlogUser),而这个联系关系对BlogUser来讲是One-To-Many(一个BlogUser能够有多个BlogSite)。
你大概会困惑?明显是单向一对一的实体干系,这里怎样弄出个一对多的干系?
假如有如许的困惑,属一般征象,我从客岁7月份写那篇文章入手下手困惑,一向困惑到如今,写篇文章时才有点弄分明。
注重,“单向一对一”是甚么?是实体干系;EntityFramework是甚么?是O/RM,是用来映照实体干系与数据库干系;还少了甚么?数据库干系。
从下面的图中的数据库布局能够看出,BlogSite与BlogUser之间是外键联系关系干系,上面的图能够更分明地看出这一点。
这个外键联系关系暗示的就是BlogUser与BlogSite之间是一对多的数据库干系。
总结一下:
实体干系——BlogSite与BlogUser之间的单向一对一
数据库干系——BlogUser与BlogSite之间的一对多
是否是如许呢?EntityFramework是否是也是如许以为的呢?我们来考证一下。
怎样晓得EntityFramework的设法呢?
经由过程EDM。
可这里是CodeFirst?
不论甚么First,都有EDM,由于这是EntityFramework的舆图,没有它,EntityFramework就会蒙头转向。CodeFirst的EDM是在EF运转时天生的,不是没有舆图,只是在EntityFramework的心中,我们看不到罢了。
怎样让EntityFramework说出内心话呢?
从MortezaManavi大家那学到一招,代码以下:- using(varcontext=newContext()){XmlWriterSettingssettings=newXmlWriterSettings();settings.Indent=true;using(XmlWriterwriter=XmlWriter.Create(@"Model.edmx",settings)){EdmxWriter.WriteEdmx(context,writer);}}
复制代码 经由过程下面的代码,你就能够拿到EF心中的舆图——edmx文件。请看舆图:
公然,EF心中的舆图就是BlogUser与BlogSite的一对多干系。舆图的感化是甚么?是让EF经由过程舆图在数据库找到对应的数据。舆图是怎样发生的?是我们经由过程FluentAPI告知EntityFramework:.HasRequired(b=>b.BlogUser).WithMany()。
我们再来分析一下.HasRequired(b=>b.BlogUser).WithMany()。
之前,我一向被困扰,是由于老是把这里的界说看成实体的干系的界说。错!这里固然用的是实体举行界说,但界说的是实体与数据库中的数据之间的映照干系(这原本就是知识,居然被疏忽了),更多的是告知EF这些实体在数据库中的数据干系。EF终极是依据这个界说天生响应的SQL。
那我们从天生查询SQL的角度来了解一下:
.HasRequired(b=>b.BlogUser)告知EF,这是一个INNERJOIN查询(BlogSiteINNERJOINBlogUser);但INNERJOIN还必要前提,WithMany()告知EF这是一个外键联系关系,EF据此举行揣度,从BlogUser中找到主键UserID,并反省BlogSite中是不是存在名为UserID的属性,假如存在,就以此为外键举行查询。而我们的BlogSite中有UserID,因而天生上面的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]FROM[dbo].[BlogSite]AS[Extent1]INNERJOIN[dbo].[BlogUser]AS[Extent2]ON[Extent1].[UserID]=[Extent2].[UserID]WHERE1=[Extent1].[IsActive]
复制代码 小结
理清“基于外键联系关系的单向一对一干系”,关头在于对modelBuilder.Entity<A>().HasRequired(A=>A.B).WithMany()的了解。
我再来了解一次:
.HasRequired(A=>A.B)暗示:1)实体A与实体B是一对一干系,实体A有一个导航属性A.B;2)在数据库中表A与表B存在一对一联系关系(INNERJOIN)。
.WithMany()暗示:1)实体B与实体A能够没有干系,也能够是一对多干系;2)在数据库中表A与表B存在外键联系关系。
下面满是我的团体了解,真正理清EntityFramework中的干系必要人人的力气,我只是抛个砖。
除“基于外键联系关系的单向一对一干系”,另有“基于共享主键的单向一对一干系”,这也是我们开辟中常常碰着的一种干系,好比博客文章(BlogPost)与文章内容(PostBody),旧事(NewsItem)与旧事内容(NewsBody)。下一篇文章将会理理这个干系。
我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:) |
|