请教网下资深ef new order 怎...

Posts - 73,
Articles - 0,
Comments - 1530
CODING 完美世界...
13:42 by KenshinCui, ... 阅读,
在开发面向数据的软件时我们常常为了解决业务问题实体、关系和逻辑构建模型而费尽心机,ORM的产生为我们提供了一种优雅的解决方案。ADO.NET Entity Framework是.NET开发中一种由ADO.NET驱动的ORM框架,使用Entity Framework开发人员可以不必考虑数据的基础数据表和列,在处理数据时能够以更高的抽象级别进行工作,并能够以相对传统开发编写更少的代码来创建和维护应用程序。
我们知道面向对象的编程与数据存储系统的交换提出了一个难题:类结构通常同关系数据表组织结构相近但又不同。例如数据中可能使用一个外键表示一个实体与另一个实体的关系,但是对于类而言我们通知会在类中定义一个属性来描述这种关系。对于这个问题当前ORM框架一般选择通过将面向对象的类和属性映射到关系表和列来弥补这种不足。但是Entity Framework并没有采取这种方式而是将逻辑模型中的表、列和外键约束映射到概念模型中的实体和关系,实体数据模型工具再基于概念模型生成可扩展的数据类。这些类派生自基类,而基类提供服务以将实体具体化为对象并进行跟踪和保存。这样一来开发人员不仅可以很方便的对数据类进行扩展而且可以像处理关联对象一样处理实体和关系。
三种编程方式
Entity Framework4.1之前EF支持“Database First”和“Model First”编程方式,从EF4.1开始EF开始支持支持“Code First”编程方式,今天简单看一下EF三种编程方式。
开始介绍这三种EF操作方式之前,首先在Visual Studio 2013中建立一个数据库连接,这里我们以“AdventureWorks”数据库为例:
Database First
“Database First”模式我们称之为“数据库优先”,前提是你的应用已经有相应的数据库,你可以使用EF设计工具根据数据库生成数据数据类,你可以使用Visual Studio模型设计器修改这些模型之间对应关系。
首先创建一个控制台应用程序,然后右键添加新建项,选择“ADO.NET Entity Data Model”,名称输入AdventureWorksContext:
接着选择从数据库生成:
下一步,选择数据库连接“SQL2008.AdventureWorks.dbo”:
点击下一步,然后选择“Person”和“PersonPhone”表:
创建完模型之后,你会发现Visual Studio自动为你生成了“Perrson”、“PersonPhone”两个实体类和一个“AdventureWorksContext”数据库上下文操作类:
下面简单的看一下如何使用EF进行数据查询,通过下面的代码我们可以看到EF对于数据的操作入多么优雅:
using System.Collections.G
using System.L
using System.T
namespace DatabaseFirst
class Program
static void Main(string[] args)
using (var db = new AdventureWorksEntities())
IQueryable&Person& persons = from people in db.People
where people.LastName == &Sánchez&
foreach (Person p in persons)
Console.WriteLine(&first name is :{0}&, p.FirstName);
if (p.FirstName == &Angela&)
p.AdditionalContactInfo = &other info&;
var persons2 = from people in db.People
where people.LastName == &Sánchez& && people.FirstName == &Angela&
if (persons2.Count() & 0)
Console.WriteLine(&additional contact information is :{0}&, persons2.First().AdditionalContactInfo);
//上面虽然可以查出来AddtionalContactInfo,但是实际省并未保存到数据库,具体保存方法在此不再详细描述
执行结果如下图:
注意:如果你的数据库表结构发生改变后,只需在模型设计视图空白处右键,选择“从数据库更新模型”接着按照向导操作即可。
Model First
Model First我们称之为“模型优先”,这里的模型指的是“ADO.NET Entity Framework Data Model”,此时你的应用并没有设计相关数据库,在Visual Studio中我们通过设计对于的数据模型来生成数据库和数据类。
首先创建一个控制台应用程序,右键添加新建项,选择“ADO.NET Entity Data Model”,名称输入AdventureWorksContext:
接着选择空模型:
在模型设计视图中,添加新实体:
输入实体对应的属性:
添加,两个Scalar属性:“Customer”和“OrderDate”;同样的方式添加第二个实体“OrderDetail”,并添加“Product”和“UnitPrice”属性:
接下来我们添加二者之间的关系,“Order”和“OrderDetail”是一对多的关系,“Order”可以通过“OrderDetails”属性访问“OrderDetail”实体,“OrderDetail”可以通过“Order”属性访问“Order”实体,并且添加了一个外键约束到“OrderDetail”中:
添加过关系后:
到目前为止Model First中的Model已经创建结束,下面就需要生成到数据库了,在模型设计视图空白处选择“从模型生成到数据库…”:
选择数据库连接,点击下一步,你将会看到生成的sql语句:
点击完成,不出意外的话将打开生成的脚本,当然你也可能会出现如下错误,请下载最新的(我本地VS2012,数据库SQLServer2008R2出现了下面的提示,下载更新即可,建议直接下载镜像文件):
此时生成了数据库上下文和实体类,并且打开了建表的脚本:
打开的数据库脚本:
然后右键选择执行即可。
然后编码查询一下:
using System.Collections.G
using System.L
using System.T
namespace ModelFirst
class Program
static void Main(string[] args)
using(var dbContext=new AdventureWorksContextContainer())
var o = new Order();
o.OrderDate = DateTime.N
ctx.Orders.Add(o);
ctx.SaveChanges();
var orders = from od in dbContext.Orders
foreach (Order order2 in orders)
Console.WriteLine(&OrderID:{0},OrderDate:{1}&,order2.Id,order2.OrderDate);
Console.Read();
注意:如果我们的模型发生改变,只需要在模型设计视图修改模型,让后保存此时实体类就会相应改变,然后选择“从模型生成到数据库”重新执行生成的脚本即可。
Code First
Code First模式我们称之为“代码优先”模式,是从EF4.1开始新建加入的功能。使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的实现过程),然后自动生成数据库。这样设计的好处在于我们可以针对概念模型进行所有数据操作而不必关系数据的存储关系,使我们可以更加自然的采用面向对象的方式进行面向数据的应用程序开发。
从某种角度来看,其实“Code First”和“Model First”区别并不是太明显,只是它不借助于实体数据模型设计器,而是直接通过编码(数据类)方式设计实体模型(这也是为什么最开始“Code First”被叫做“Code Only”的原因)。但是对于EF它的处理过程有所差别,例如我们使用Code First就不再需要EDM文件,所有的映射通过“数据注释”和“fluent API”进行映射和配置。另外需要注意的是“Code First”并不代表一定就必须通过数据类来定义模型,事实上也可以通过现有数据库生成数据类。
那么我们首先看一下传统的Code First如何使用。
首先创建一个控制台应用程序,接下来添加两个类“Order”和“OrderDetail”,我们可以看到这两个类只是简单的C#对象(POCO,Plain Old C# Object)这两个类基本和EF没有任何关系,需要注意的是这两个类有两个导航属性“Order.OrderDetails”和“OrderDetail.Order”:
using System.Collections.G
namespace CodeFirst
public class Order
public int Id { get; set; }
public string Customer { get; set; }
public System.DateTime OrderDate { get; set; }
public virtual List&OrderDetail& OrderDetails { get; set; }
using System.Collections.G
namespace CodeFirst
public partial class OrderDetail
public int Id { get; set; }
public string Product { get; set; }
public string UnitPrice { get; set; }
public int OrderId { get; set; }
public virtual Order Order { get; set; }
有了这两个类之后让我们定义一个数据库上下文,有了它我们就可以对数据进行增删改查操作了,这个类必须继承于&System.Data.Entity.DbContext”类以赋予它数据操作能力。因此接下来我们需要给这个应用安装EntityFramework包,因为到目前为止我们并没有引入EF框架相关的任何内容,我们需要引入EF相关程序集。但是我们有更好的选择那就是NuGet。通过NuGet进行在线安装:项目中右键选择&Manage NuGet Packages…”;选择Online;再选择“EntityFramework”;然后点击安装即可。不了解NuGet的朋友到这里看一下。数据库上下文操作类:
using System.Collections.G
using System.L
using System.T
using System.Data.E
namespace CodeFirst
public class OrderContext:DbContext
public DbSet&Order& Orders
public DbSet&OrderDetail& OrderDetails
然后我们进行测试,在这个类中我们首先创建了一个Order实例,接着编码查询:
using System.Collections.G
using System.L
using System.T
namespace CodeFirst
class Program
static void Main(string[] args)
using (var ctx = new OrderContext())
var o = new Order();
o.OrderDate = DateTime.N
ctx.Orders.Add(o);
ctx.SaveChanges();
var query = from order in ctx.Orders
foreach (var q in query)
Console.WriteLine(&OrderId:{0},OrderDate:{1}&, q.Id, q.OrderDate);
Console.Read();
查询结果如图:
如果是第一次使用EF Code First的朋友一定会有疑问,我们没有进行任何数据库配置,增加了一条数据通过查询确实保存上了,那么我们的数据到底在哪呢?事实上如果用户不进行数据库配置EF默认会使用“.\SQLEXPRESS”数据库实例,如果你没有安装“.\SQLEXPRESS”则默认使用LocalDb,关于LocalDb的具体细节请看:,例如我本机就存放在:“C:\Users\Kenshin”,可以看到创建了一个名为“CodeFirst.OrderContext”的数据库:
但是多数情况下我们是希望自己控制这个数据库的,例如我想让他保存在我机器上的”.\SQL2008”实例上,此时我们就需要在配置文件App.Config中配置一个数据库连接串,然后在我们的数据库上下文中指定这个连接名称。
配置文件:
&?xml version=&1.0& encoding=&utf-8&?&
&configuration&
&configSections&
&!-- For more information on Entity Framework configuration, visit /fwlink/?LinkID=237468 --&
&section name=&entityFramework& type=&System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c& requirePermission=&false& /&
&/configSections&
&connectionStrings&
&add name=&CodeFirstDb& connectionString=&Data Source=.\SQL2008;Database=CodeFirstDb;UID=PWD=123;& providerName=&System.Data.SqlClient&&&/add&
&/connectionStrings&
&entityFramework&
&defaultConnectionFactory type=&System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework&&
&parameters&
&parameter value=&v11.0& /&
&/parameters&
&/defaultConnectionFactory&
&/entityFramework&
&/configuration&
OrderContext类,构造函数多了一个连接名参数:
using System.Collections.G
using System.L
using System.T
using System.Data.E
namespace CodeFirst
public class OrderContext:DbContext
public OrderContext(string connectionName)
: base(connectionName)
public DbSet&Order& Orders
public DbSet&OrderDetail& OrderDetails
使用的时候,传入配置的数据库连接字符串名称:
using System.Collections.G
using System.L
using System.T
namespace CodeFirst
class Program
static void Main(string[] args)
using (var ctx = new OrderContext(&CodeFirstDb&))
var o = new Order();
o.OrderDate = DateTime.N
ctx.Orders.Add(o);
ctx.SaveChanges();
var query = from order in ctx.Orders
foreach (var q in query)
Console.WriteLine(&OrderId:{0},OrderDate:{1}&, q.Id, q.OrderDate);
Console.Read();
执行之后就会发现在”.\SQL2008”实例上多了一个“CodeFirstDb”数据库(注意图中除了我们创建的两个实体表还有一个系统表dbo._MigrationHistory它记录了模型的定义,在以后的文章中我会着重解释此表):
到了这里我们三种EF编程方式已经全部介绍完了,关于Code First模式如何更新模型、如何先建数据库再生成数据类以及更多EF问题在接下来的文章中再探讨。由于您的浏览器禁用了javascript,无法正常使用本网站功能,
其它关键字
作 者 推 文
[收藏此章节] [下载]&&
  漫天烟花,嬉笑声,爆竹声,声声入耳。。335f《》 @ Copyright of 晋江原创网 @  微笑到僵直的脸在冷风中开始不自然起来,背过人群,陈子柔松了口气,拿出手里来看看有没有易云给她的消息。。f2fcc49d51a18a32b3《》 @ Copyright of 晋江原创网 @  看着很久很久之前拍到的易云撩起袖子帮着事务所打扫卫生的照片,真想知道她好不好,在做什么。或许早该想到,那么个容易冲动的人会跑回去对着父母说自己喜欢女人。唉,借自己十个胆她都不敢回家对爸爸说喜欢女人不结婚了......。ba3866《》 @ Copyright of 晋江原创网 @  。8c235f89ad8《》 @ Copyright of 晋江原创网 @  陈子柔赶到自己爸爸家时已经快晚上九点了,刚推开门,大哥的俩个孩子就扑到她身上抱着她开始撒娇。。c9ef9fc8ea15d152add07294《》 @ Copyright of 晋江原创网 @  “姑姑,新年快乐!恭喜发财......大红包拿来......”。9b04da3783940  “呵呵,再说些好听的......”陈子柔蹲下身来摸着俩小男孩的头笑着说,“说姑姑是世界上最漂亮的......”。e8c0653fea13f91bf3cf《》 @ Copyright of 晋江原创网 @  还没说完,陈子楚就在一旁哼哼了,说世界上最漂亮的是白雪公主。。7cbbc409ec99  陈子柔瞪了陈子楚一眼,搂着俩孩子说:“叔叔说姑姑不是世界上最漂亮的,所以,没红包了......要不,你们去把他打倒了,姑姑再给你们......”。8bfba43b  “好的!”俩小孩看着对方挑了挑眉,大吼一声后冲向了坐在沙发上看电视的陈子楚。吓得陈子楚赶紧从沙发上弹起来躲着俩小孩......。67f7fb87《》 @ Copyright of 晋江原创网 @  。e8c0653fea13f91bf3cf78《》 @ Copyright of 晋江原创网 @  “子柔~”。98dce83da57bc9dae521《》 @ Copyright of 晋江原创网 @  “呵呵,嫂子~~”。6fd3ebaabb04d6b《》 @ Copyright of 晋江原创网 @  陈子柔坐到了两个嫂子中间,开始女人们最擅长的八卦来。只是聊天再开心,都无法集中精神,完完全全的投入其中。。c06d06dacf57《》 @ Copyright of 晋江原创网 @  。c4b31ce7d95c75ca70d50c19aef08bf1《》 @ Copyright of 晋江原创网 @  “魂不守舍想那谁啊?”陈子楚提着俩小孩从厨房里出来,看着陈子柔说到,“哎呀,就说小孩子不懂事吧......”。dceb2e219dce49e6《》 @ Copyright of 晋江原创网 @  “呵呵,子柔,有喜欢的人啦?”。b056eb1587《》 @ Copyright of 晋江原创网 @  “是吗?不带回家看看?”。a764c8《》 @ Copyright of 晋江原创网 @  “呵呵,呵呵......”陈子柔瞪着陈子楚,说到,“我,我进去帮大哥和爸爸的忙去啊......对了,那些个包里是小孩子的礼物,可以去拆啦......”。0353ab4cbed5beae847a7ff6e220  说完赶紧的躲进厨房里。只是厨房里那俩也不放过自己。。ac1dd209cbcc5e5d1c6e28  “子柔啊,他们说的是事实吗?”陈子豪系着围裙忙着手里的活说到,“上次不是说还有个小男朋友吗?”。d7a728a67d909e714c6f2《》 @ Copyright of 晋江原创网 @  “她啊,上次陪我钓鱼时都说有喜欢的人,那么久了还神神秘秘的很~~”  陈子柔叹了叹气,看着眼前俩自己最喜欢的男人,笑着说还没定呢,定了肯定就带回来了。  “子柔啊,爸爸不反对,只不过太小的不好吧?会不会对你有所企图啊?现在的小孩子都不怎么单纯咯~~”。ddbe896d03《》 @ Copyright of 晋江原创网 @  “哈哈,爸爸,还有人能骗得了她?!”陈子楚不知什么时候倚在厨房门口看着陈子柔说,“没人能骗她,除非......”。912d2b1c7b2826caf99687《》 @ Copyright of 晋江原创网 @  “陈子楚,你不说话没人当你哑巴啊......”陈子柔恨死他了,没事总来烦人。瞪了他几眼,说着要回几个电话就走到了后院,关上门,蹲下来看着后院那俩超大的牧羊犬冲着自己张开着嘴摇着尾巴,她无助的拿出手机来。可是看着通讯录,打给谁呢?。aeb7  。0bb4aecee7《》 @ Copyright of 晋江原创网 @  “对不起,您拨打的电话暂时无法接通,请稍后再拨......”好吧,易云接不通......  “中国移动来电提醒业务......”OK,Amy不接......。ef840f0c74a814ec9  “对不起,您拨打的电话暂时不在服务区......”well done! 老同学还不知道躲在哪里......  。185e65bcf2c82958de8cfe《》 @ Copyright of 晋江原创网 @  站起身来,站在冷风里抖了抖,刚要推门进去,手机响了。。4ffce04d92a4d6cb21c1  “子柔~”。c16ad6ef《》 @ Copyright of 晋江原创网 @  “呵呵,你在哪里啊?”。9f396fe44e7c05c168《》 @ Copyright of 晋江原创网 @  “在奶奶家啊......”。077e29b11be80ab57e1a《》 @ Copyright of 晋江原创网 @  “真的?”。cfcdef66e7dff9f98764《》 @ Copyright of 晋江原创网 @  “当然咯,要听听这里的方言吗?”易云似乎和旁边的人讲了一句什么,电话那头就想起了许多小孩子的声音,“姐姐,新年快乐~~”。077e29b11b《》 @ Copyright of 晋江原创网 @  “呵呵,你当孩子王了啊~~”。a4fea《》 @ Copyright of 晋江原创网 @  “那是!我易云是谁啊?!”。53c3bce66e43be《》 @ Copyright of 晋江原创网 @  不知道讲些什么了,那个平日里没大没小整天嘻嘻哈哈的易云此刻似乎变了个人,陈子柔猜想的事情或许她真的就已经做了,估计情况还比较糟糕。。642e92efbb53e1e1b18  “云~~”。115fa242f40fb7d7f338e《》 @ Copyright of 晋江原创网 @  “啊?”。f2fcc49d51a18a32b39f0c《》 @ Copyright of 晋江原创网 @  “笑笑嘛~~”。b6f459《》 @ Copyright of 晋江原创网 @  “哈哈,干吗啊?我不是在笑吗?难道你感觉不到?”。cfbce4c1d7c425baf21d6b6f  “是吗?”陈子柔微笑着,心里的话或许还是不要对她讲的好,没必要给这个原本无忧无虑直来直去的孩子那么多负担。。e0a11a242b9765《》 @ Copyright of 晋江原创网 @  “子柔......我想你了啊......”。《》 @ Copyright of 晋江原创网 @  “我不信哦......”。d554f7bb7be44a7267068a《》 @ Copyright of 晋江原创网 @  “呃......”。1ff1deda13fc《》 @ Copyright of 晋江原创网 @  “呵呵,新年快乐......小孩要开心哦......我想你了......”。68d30a  “哈哈,我相信你的......”。e6cb2a3c14431b《》 @ Copyright of 晋江原创网 @  。8d7d8ee069cb0cbbf816bbb65d56947e《》 @ Copyright of 晋江原创网 @  俩个人也没多说什么后来全纠结到年夜饭上去了,最后在陈子柔那俩侄子的叫喊声中陈子柔挂掉了电话。。d6baf65e0b240ce177cf70da146c8dc8《》 @ Copyright of 晋江原创网 @  “知道啦~~就来就来~~”。a4a042cf4fd6bfb477《》 @ Copyright of 晋江原创网 @  “姑姑,快点来啊......小品开始啦......”。d7a728a67d909e714c6f2  “来啦来啦......”。71ad16ad2c4d81f348082f《》 @ Copyright of 晋江原创网 @  。352fe25daf686bdb4edca223c921acea《》 @ Copyright of 晋江原创网 @  吃完年夜饭,放完烟花,洗好碗,看看时间已经过了凌晨一点了......想想明天开始是更加腻烦的过年饭局,想想胃里的东西就开始翻滚......。35《》 @ Copyright of 晋江原创网 @  “想什么呢?”陈子楚坐到了陈子柔身边,打开了后院那盏灯,俩被爆竹声吓到躲在小房子里不敢出声的牧羊犬此时微微的探出了脑袋,警惕的盯着俩人看着。。ce1a1aec  陈子柔看着陈子楚,笑着说到:“你还记得小时候在下乡的夏天带着我偷西瓜吗?”  “哎呀,每次都是你拖后腿......”。7ef605fc《》 @ Copyright of 晋江原创网 @  “什么啊,明显就是你,贪心,一个不够非要两个,要是遇到小的还要三个四个......”  “真不知道你长那长腿干吗的,跑跑就没力气......”。cd00692c3bfe59267d5ecfac  “呵呵......”陈子柔突然间扯过陈子楚的手来,把头搁到了他的肩膀上,说到,“我该告诉爸爸吗?我喜欢......”。41ae36ecb9b3eee609d05b90《》 @ Copyright of 晋江原创网 @  “别,你是要气死他啊,他可希望看你结婚生孩子了......你一说他气倒了怎么办?别做那么没脑子的事情出来!”。bd4c9ab730fec0d《》 @ Copyright of 晋江原创网 @  “哦......”。e2c0bee599c2a9c9d0《》 @ Copyright of 晋江原创网 @  陈子柔也就自己说说,她吃了豹子胆都不会去跟爸爸说的,但那样似乎对易云来讲十分的不公平......说到底,自己是没她那么激动还是没她那么没脑子,还是,真正爱不起的是她自己,而不是那愣头愣脑的小朋友......。e6b4b2a746ed40e1af829d《》 @ Copyright of 晋江原创网 @  “不过......”陈子楚突然间就卖关子起来了,笑着看着陈子柔说,“也不是不可能啊......”  “什么?”。2f885d0fbe2e131bfc9d《》 @ Copyright of 晋江原创网 @  “你带她私奔不就得了?”。1728efbda8169228《》 @ Copyright of 晋江原创网 @  陈子柔翻了好几个白眼,嫌弃的松开了陈子楚的手,说:“你是Amy上身是吧?!”  “哈哈......唉......”。ddb718《》 @ Copyright of 晋江原创网 @  “唉......算我没说......不过......”。6e7b《》 @ Copyright of 晋江原创网 @  “得,我可不是为了什么而叹气啊,我爱你嫂子,日月可鉴,Amy那女人是不错但是口味不对啊......我们的目标是......贤妻良母......"。f4f6dc《》 @ Copyright of 晋江原创网 @  “去去去~~别恶心了......赶紧看看育儿的书吧,省得到了五月你手忙脚乱的......”陈子柔起身走回了屋子,是时候躺下睡觉了。。d64a340bcb63《》 @ Copyright of 晋江原创网 @  “子柔。其实......你或许该了解下易云,更深的了解下在把自己的心交出去啊......”  “我知道......晚安......”。115f《》 @ Copyright of 晋江原创网 @  。a764c8e3a691fa2b3a321d《》 @ Copyright of 晋江原创网 @  陈子楚关掉了后院的灯,看着院子里那俩牧羊犬发光的眼睛,想着给自己要出生的孩子起什么名字。。3fe94afaeea4cd《》 @ Copyright of 晋江原创网 @  “陈颢什么呢?唉,烦人......当爸真不容易啊......颢文?貌似不错......男女都适用......话说女孩子像姑姑啊......别那么冷淡就好......“。0353ab4cbed5beae847a7ff6e220b5  。e6fa44e1ed0ff613f563bd《》 @ Copyright of 晋江原创网 @
插入书签 
该作者现在暂无推文
手机网wap.jjwxc.net支持二维码阅读
↑返回顶部
第57章 第 57 章
作 者 推 文
作者加精评论
本文相关话题
以上显示的是最新的二十条评论,要看本章所有评论,linq/EF/lambda Group by/Order by 多个字段详细用法 - IT大师
& 02:07:06
1)单个字段Group by://a.Key类型与a.Province字段类型一样
.GroupBy(a&=&&a.Province).Select(a&=&&a.Key).ToList();2)多个字段Group by://此时返回的数据列表需要自己转换
.GroupBy(a&=&&new&{&a.Date,&a.Week&}).Select(a&=&&a.Key).ToList();3)单个字段Order by:.OrderBy(a&=&&a.Date).ToList()4)多个字段Order by:.OrderBy(a&=&&a.Date).ThenBy(a&=&&a.EndTime).ThenBy(a&=&&a.StartTime).ToList()5)多个字段Order by倒序:.OrderByDescending(a&=&&a.Date).ThenByDescending(a&=&&a.EndTime).ThenByDescending(a&=&&a.StartTime).ToList()
文章链接:
原创说明:转载原创文章时请保留原文链接,谢谢!
转载说明:本站转载文章均标明文章来源,若本篇转载侵犯了您的权益,请联系站长删除!
交流Q群:
开源组件:、深入显出EF之ModelFirst和DBFirst - 数据库当前位置:& &&&深入显出EF之ModelFirst和DBFirst深入显出EF之ModelFirst和DBFirst&&网友分享于:&&浏览:0次深入浅出EF之ModelFirst和DBFirst& & & & 在上篇博文中,小编主要简单的介绍了一下EF的一些基础知识,其中,小编蜻蜓点水的提了一下ModelFirst和DBFirst,ModelFirst先设计实体,然后根据模型生成数据库,DBFirst根据数据库生成模型,两个方向都是可以了,两个方向可以相互更新,比如新添加了实体,可以根据模型生成数据库,如果在数据库里面新添加了字段,我们可以从数据库更新模型。在介绍ModelFirst和DBFirst之前,我们先来解决两个问题,EF与linq
to sql的关系以及为什么使用linq to sql和EF。
& & & & &EF与linq to sql的关系
& & & & &linq &to sql&是微软ORM思想的一个具体化,EF也是它的一个具体化,那么,这两个产品有什么区别呢?Linq to Sql是ORM思想实现的一个轻量级的框架,EF是一个重量级框架;Linq to Sql和EF的一个重要的区别就是,Linq to Sql只能针对于SQL Server数据库,而EF可以针对于很多的数据库(Oracle,SQL Server等),也就是说EF是跨数据库的,不要小看这一点,在实际的开发中,非常的实用,举个简单的小例子,还记我们敲的VB.NET版本的机房收费系统么,其中涉及到了数据访问层,如果出于某种原因,我们换了数据库,那么,我们就需要重新编写数据访问层,如果我们在创机房收费系统这个项目的时候,使用了linq
to sql,更换了数据库linq to sql框架就需要重新进行大量的改动,如果使用了EF框架,那么我们只需要改动其中的配置文件就可以了,不需要修改程序中的代码。
& & & & 为什么使用linq to sql和EF
& & & & 这个问题,也关乎我们的D层,还记得敲机房收费系统的时候,我们会抽出来一个sqlhelper类,这个类实现了对数据库的增删改查,然后,我们的再创建相应的D层类,这些类方法的功能,其实都差不多,唯一不同的就是sql,从这里我们可以看到,我们的D层的问题,那就是,我们重复性的书写一些不必要的类或者方法,解决这个方法就需要慢慢的抽象,抽象出共有的东西,像:DataTable装换为实体集,操作数据库的几类方法(注意其参数),然后将其一整合,这个大致就是我们所属的ORM思想实现的雏形了,当然,上面所说的那些东西,Linq
to Sql或EF这些框架已经帮助我们实现了,我们只需要使用它们提供的方法就行了,从这里我们也可以看到,如果我们使用这些框架,我们程序员在编程的时候,几乎不需要管理D层的东西,只需要关注业务的实现就可以了。
& & & & 接下来,小编就来简单的介绍一下ModelFirst,ModelFirst先设计实体,然后根据模型生成数据库,如下图所示,
& & & &&我们可以再图中空白处右击添加实体,还可以新增标量属性,以及添加关联。接着,我们可以根据上面的实体生成数据库,如下图所示:
& & & & 生成的代码如下所示:
&span style=&font-size:18&&&span style=&font-size:18&&-- --------------------------------------------------
-- Entity Designer DDL Script for SQL Server , 2012 and Azure
-- --------------------------------------------------
-- Date Created: 01/28/:19
-- Generated from EDMX file: C:\Users\Flower\Desktop\EFDemo\ModelFirstDemo\DataModel.edmx
-- --------------------------------------------------
SET QUOTED_IDENTIFIER OFF;
USE [ModelFirstDemoDb2];
IF SCHEMA_ID(N'dbo') IS NULL EXECUTE(N'CREATE SCHEMA [dbo]');
-- --------------------------------------------------
-- Dropping existing FOREIGN KEY constraints
-- --------------------------------------------------
IF OBJECT_ID(N'[dbo].[FK_CustomerOrder]', 'F') IS NOT NULL
ALTER TABLE [dbo].[Order] DROP CONSTRAINT [FK_CustomerOrder];
-- --------------------------------------------------
-- Dropping existing tables
-- --------------------------------------------------
IF OBJECT_ID(N'[dbo].[Customer]', 'U') IS NOT NULL
DROP TABLE [dbo].[Customer];
IF OBJECT_ID(N'[dbo].[Order]', 'U') IS NOT NULL
DROP TABLE [dbo].[Order];
-- --------------------------------------------------
-- Creating all tables
-- --------------------------------------------------
-- Creating table 'Customer'
CREATE TABLE [dbo].[Customer] (
[Id] int IDENTITY(1,1) NOT NULL,
[CusName] nvarchar(32)
[SubTime] datetime
[DelFlag] smallint
-- Creating table 'Order'
CREATE TABLE [dbo].[Order] (
[Id] int IDENTITY(1,1) NOT NULL,
[OrderContent] nvarchar(max)
[CustomerId] int
-- Creating table 'UserInfo'
CREATE TABLE [dbo].[UserInfo] (
[Id] int IDENTITY(1,1) NOT NULL
-- --------------------------------------------------
-- Creating all PRIMARY KEY constraints
-- --------------------------------------------------
-- Creating primary key on [Id] in table 'Customer'
ALTER TABLE [dbo].[Customer]
ADD CONSTRAINT [PK_Customer]
PRIMARY KEY CLUSTERED ([Id] ASC);
-- Creating primary key on [Id] in table 'Order'
ALTER TABLE [dbo].[Order]
ADD CONSTRAINT [PK_Order]
PRIMARY KEY CLUSTERED ([Id] ASC);
-- Creating primary key on [Id] in table 'UserInfo'
ALTER TABLE [dbo].[UserInfo]
ADD CONSTRAINT [PK_UserInfo]
PRIMARY KEY CLUSTERED ([Id] ASC);
-- --------------------------------------------------
-- Creating all FOREIGN KEY constraints
-- --------------------------------------------------
-- Creating foreign key on [CustomerId] in table 'Order'
ALTER TABLE [dbo].[Order]
ADD CONSTRAINT [FK_CustomerOrder]
FOREIGN KEY ([CustomerId])
REFERENCES [dbo].[Customer]
ON DELETE NO ACTION ON UPDATE NO ACTION;
-- Creating non-clustered index for FOREIGN KEY 'FK_CustomerOrder'
CREATE INDEX [IX_FK_CustomerOrder]
ON [dbo].[Order]
([CustomerId]);
-- --------------------------------------------------
-- Script has ended
-- --------------------------------------------------&/span&&/span&& & & & 接着我们来看一个具体的例子,ModelFirst关联实体的插入操作代码如下所示:
&span style=&font-size:18&&&span style=&font-size:18&&using S
using System.Collections.G
using System.L
using System.T
using System.Threading.T
namespace ModelFirstDemo
class Program
static void Main(string[] args)
DataModelContainer db = new DataModelContainer();
Model First 关联实体的插入操作
Customer customer = new Customer();
customer.CusName = &呵呵&;
customer.DelFlag = 0;
customer.SubTime = DateTime.N
Order order = new Order();
order.OrderContent = &Flower&;
//给导航属性赋值
//order.CustomerID= customer.ID;
order.Customer =
Order order2 = new Order();
order2.OrderContent= &Flower2&;
order.CustomerID= customer.ID;
order2.Customer =
db.Customer.Add(customer);
db.Order.Add(order);
db.Order.Add(order2);
db.SaveChanges();
#endregion
}&/span&&/span&& & & & 接着,我们来看一下DBFirst,根据数据库生成模型,我们具体来看下面一段代码:
&span style=&font-size:18&&&span style=&font-size:18&&using S
using System.Collections.G
using System.L
using System.T
using System.D
namespace EF.EntityFrameworkDemo
class Program
static void Main(string[] args)
#region 添加实体
////创建上下文对象
//DBFirstEntities dbFirst = new DBFirstEntities();
////操作实体
//T_Customer customer = new T_Customer();
//customer.CusName = &新添用户&;
////附加在上下文
//dbFirst.T_Customer.AddObject(customer);
//dbFirst.SaveChanges();
#endregion
#region 删除实体
////1、创建上下文对象
//DBFirstEntities dbFirst = new DBFirstEntities();
////2、创建实体
//T_Customer customer = new T_Customer();
//customer.ID = 9;
////3、将实体附加到上下文里面来进行管理
//dbFirst.T_Customer.Attach(customer);
////修改实体的状态
//dbFirst.ObjectStateManager.ChangeObjectState(customer, EntityState.Deleted);
////4、上下文操作数据库
//dbFirst.SaveChanges();
#endregion
#region 修改实体
////1、创建访问数据库的上下文对象
//DBFirstEntities dbFirst = new DBFirstEntities();
////2、修改对象
//T_Customer customer = new T_Customer();
//customer.ID = 4;
//customer.CusName = &用户4_修改后2&;
////3、附加到数据库
//dbFirst.T_Customer.AddObject(customer);
////修改对象状态
//dbFirst.ObjectStateManager.ChangeObjectState(customer, EntityState.Modified);
////4、上下文更新数据库
//dbFirst.SaveChanges();
#endregion
#region 查询
DBFirstEntities dbFirst = new DBFirstEntities();
foreach (var item in dbFirst.T_Customer)
Console.WriteLine(string.Format(&ID:{0}
Name:{1}&,item.ID,item.CusName));
#region linq表达式
T_Customer cs = (from customer in dbFirst.T_Customer where customer.ID == 2 select customer).SingleOrDefault();
Console.WriteLine(&ID:{0}
Name:{1}&,cs.ID,cs.CusName);
#endregion
#endregion
Console.ReadKey();
&/span&&/span&
& & & & ModelFirst和DBFirst两种方式,都可以达到我们想要的效果,实现同样的目的,两个方法可以相互更新,最后小编简单的来介绍一下延迟加载,延迟加载也可以叫做按需加载,可以分两方面来理解,一方面指暂时不需要该数据,不用在当前马上加载,而可以推迟到使用它时再加载;另一方面指不确定是否将会需要该数据,所以暂时请不要加载,待确定需要后再加载它。延迟加载是一种很重要的数据访问特性,可以有效地减少与数据源的交互(注意,这里所提的交互不是指交互次数,而是指交互的数据量),从而提升程序性能。在EF中有两种延迟加载,具体代码如下所示:
&span style=&font-size:18&&&span style=&font-size:18&&using S
using System.Collections.G
using System.L
using System.T
using System.Threading.T
namespace ModelFirstDemo
class Program
static void Main(string[] args)
DataModelContainer db = new DataModelContainer();
Model First 关联实体的插入操作
Customer customer = new Customer();
customer.CusName = &呵呵&;
customer.DelFlag = 0;
customer.SubTime = DateTime.N
Order order = new Order();
order.OrderContent = &Flower&;
//给导航属性赋值
order.CustomerID= customer.ID;
order.Customer =
Order order2 = new Order();
order2.OrderContent= &Flower2&;
order.CustomerID= customer.ID;
order2.Customer =
db.Customer.Add(customer);
db.Order.Add(order);
db.Order.Add(order2);
db.SaveChanges();
#endregion
#region 补充另外一个汇总查询方式:Lambda表达式
Lambda表达式和linq表达式在编译阶段之后生成的IL代码是一样的
var item = (from c in db.Customer
where c.Id == 2
select c).FirstOrDefault();
List&string& list = new List&string&();
list.FindAll()
Function&Customer,bool&
lambda的方式
var itemLambda = db.Customer.Where&Customer&(c=&c.Id==1).FirstOrDefault();
Console.WriteLine(itemLambda.CusName);
#endregion
#region 延迟第一种
使用linq或者lambda表达式查出来的数据,只有使用的时候才回去真正的查询数据
var items = from c in db.Customer
where c.Id & 10
foreach (var customer in items)
Console.WriteLine(customer.Id);
IQueryable
foreach (var customer in items)
Console.WriteLine(customer.Id);
#endregion
#region 第二种延迟加载
var customers = from c in db.Customer
foreach(var cus in customers)
Console.WriteLine(cus.Id + &------&);
foreach (var order in cus.Order)
Console.WriteLine(order.Id);
Console.WriteLine(&------&);
#endregion
#region 查询部分列的数据
只查询表中的部分列的数据
var items = from c in Customer
where c.Id & 100
select new { id = c.Id, CusName = c.CusName, count = 0, orderCount = c.Order.Count() };
foreach (var item in items)
Console.WriteLine(item.CusName + &------& + item.orderCount);
#endregion
#region IQuerable接口跟其他集合的区别
var items = (from c in db.Order
where c.Id & 2
select c).ToList();
foreach (var order in items)
Console.WriteLine(order.Id);
#endregion
Console.ReadKey();
&/span&&/span&& & & &小编寄语:该博文,小编主要介绍了一些EF的基础知识,分别从三个大方面对EF进行详细介绍,第一个方面:EF与linq to sql的关系以及为什么要使用EF与linq &to sql,第二方面,介绍了一下ModelFirst和DBFirst,最后介绍了一下延迟加载,对于EF的相关知识,小编刚刚接触,理解的还是很浅,有不同意见的小伙伴可以一起讨论交流哦,常常想,如果不是因为缘分,如果不是因为接受了项目什么mvc、EF、linq等,小编也没有这么快就开始接触,在接项目的过程中学习,再把学习到的知识运用到项目中,赶脚棒棒哒,档案管理项目,未完待续......
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 1234567891011 Copyright & &&版权所有

我要回帖

更多关于 请教网 的文章

 

随机推荐