前言sql
首先来简单的复习一下如何使用Code First。数据库
第一步仍是先创建一个控制台的应用程序,而后经过Nuget添加Entity Framework。那么同时会给packages.config和App.config添加相应的配置。ide
第二步添加一个数据操做上下文实体类。添加两个构造函数,并添加一个Person的实体类。 在App.config的配置文件中添加相应的数据连接配置。函数
第三步在调用便可生成相应的数据库。测试
EFContext.csui
public class EFContext:DbContext { public EFContext() : base("EFContext") { } public EFContext(string connectionstring) :base(connectionstring) { } public DbSet<Person> Persons { get; set; } }
App.config编码
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="EFContext" connectionString="Data Source=.;Database=EFContext;UID=sa;PWD=sa123;" providerName="System.Data.SqlClient"></add> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> </entityFramework> </configuration>
package.config spa
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="EntityFramework" version="5.0.0" targetFramework="net45" /> </packages>
而后简单的添加了一个实体类code
public class Person { public int PersonId { get; set; } public string PersonName { get; set; } public int Age { get; set; } public string Address { get; set; } public string Email { get; set; } }
最终进行调用orm
static void Main(string[] args) { using (var db = new EFContext("EFContext")) { var persons = db.Persons.Where(t => t.PersonName == "aehyok").OrderByDescending(t => t.PersonId).ToList(); foreach (var p in persons) { Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age); } } Console.ReadLine(); }
运行后控制台没有数据显示,可是在数据库里能够查看到相应的数据库EFContext和数据表People。
如今咱们经过数据库直接为上面创建的数据库EFContext中的People表手动添加了几条数据。
而后从新运行程序。能够发现有数据了。
此时能够发现咱们的第一个简答的查询语句已经实现了。
一个数据库上下文的生命周期随着该对象的建立而开始,随着对象的释放(或GC回收)而结束,所以建议在开发过程当中使用“Using”编码方式,这样就能够免去手动释放对象的操做。另外对于数据库链接的管理在EF中是透明的,咱们通常不须要手动进行处理,当查询一个对象时打开链接当处理完查询的结果集以后会自动关闭链接。
Linq To Entity表达式查询
查询表达式是C#3.0新增的功能,它是由一组相似于T-SQL或XQuery声明性语句组成,CLR并不能直接读取这种查询表达式而是在编译时转换为对应的方法调用。以下面的例子:
using (var db = new EFContext("EFContext")) { var persons = from p in db.Persons where p.PersonName == "aehyok" orderby p.PersonId descending select p; foreach (var p in persons) { Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age); } } Console.ReadLine();
获得的结果同上面是一致的。
基于方法的查询
基于方法的查询事实上是一组对象的扩展方法,同Linq查询不一样的是这些方法能够直接被CLR识别并运行。
例如上面的方法咱们能够转换为以下代码,他们的效果是同样的,返回的都是“IQueryable”对象,这里的代码其实也就是咱们开始为建立数据库测试的代码
using (var db = new EFContext("EFContext")) { var persons = db.Persons.Where(t => t.PersonName == "aehyok").OrderByDescending(t => t.PersonId).ToList(); foreach (var p in persons) { Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age); } } Console.ReadLine();
固然执行的结果仍是同样的。
原生SQL的查询
EF还支持原生SQL查询, 在DataBase上的SQlquery使你可以执行sql返回任意类型的数据,例如:
using (var db = new EFContext("EFContext")) { var persons = db.Persons.SqlQuery("select * from EFContext..People where PersonName='aehyok'"); foreach (var p in persons) { Console.WriteLine("The PersonName is {0} and Age {1}", p.PersonName, p.Age); } } Console.ReadLine();
能够直接经过SQL语句的拼接额,固然这里只是作了最简单的实例。
不只如此,EF还支持非实体类型的查询:
using (var db = new EFContext("EFContext")) { var persons = db.Database.SqlQuery<string>("select PersonName from EFContext..People where PersonName='aehyok'"); foreach (var p in persons) { Console.WriteLine("The PersonName is {0} ", p); } }
使用DataBase的ExecuteSqlCommand去更新数据:
using (var db = new EFContext("EFContext")) { var persons = db.Database.ExecuteSqlCommand("update EFContext..People set Address='中国' where PersonName='aehyok'"); }
使用ExecuteSqlCommand 或者SqlQuery直接指定存储过程:
context.Database.ExecuteSqlCommand ("EXECUTE [dbo].[DoSomething]").