日期:2014-05-20  浏览次数:20838 次

Entity Framework 学习总结之五:EntityClient

System.Data.EntityClient

EntityClient 提供程序使用存储特定的 ADO.NET 数据提供程序类和映射元数据与实体数据模型进行交互。 EntityClient 首先将对概念性实体执行的操作转换为对物理数据源执行的操作。 该提供程序将从物理数据源返回的结果集转换为概念性实体。

?

参考 MSDN


?

EntityConnection EntityCommand EntityDataReader 使用

为了避免无意使对象(如 System.Data.Common.CommandTrees ObjectContext )与其元数据失去同步, EntityConnection 必须锁定对象的元数据。锁定元数据后,不允许对连接字符串做出任何更改。

?

下面是锁定元数据的两种方案:

·??? EntityConnection 实例通过默认的构造函数或接受连接字符串的 EntityConnection(String) 构造函数进行构造。 在任何一种情况下,连接字符串可能在打开连接前进行多次更改。 调用 [M:System.Data.EntityClient.EntityConnection.Open()] [M:System.Data.EntityClient.EntityConnection.GetMetadataWorkspace()] 锁定元数据。

·??? EntityConnection 实例通过 EntityConnection(MetadataWorkspace, DbConnection) 构造函数进行构造,此构造函数接受 MetadataWorkspace DbConnection 在这种情况下,元数据在构造时锁定。 不允许对连接字符串做出任何更改。

?

加载元数据后, EntityConnection 验证概念性模型、存储模型和映射文件是否全部存在。

?

代码片断:

//string connStr = System.Configuration.ConfigurationManager.ConnectionStrings["CSharpTestEntities"].Conne

//CSharpTestEntities edm = new CSharpTestEntities();

//string connStr = edm.Connection.ConnectionString;

string connStr = "name = CSharpTestEntities" ;?? // 这三种方法都可以获取连接字符串

using (EntityConnection conn = new EntityConnection(connStr) )

{

??? string sqlStr = "select value u from CSharpTestEntities.Users as u order by u.UserID desc" ;

?

??? conn.Open();

??? EntityCommand ecmd = new EntityCommand (sqlStr, conn);

??? EntityDataReader edr = ecmd.ExecuteReader(CommandBehavior .SequentialAccess);

?

??? if (edr.Read())

??? {

??????? Console .WriteLine(edr["UserID" ]);?? // 输出第一条

??????? Console .WriteLine(edr[1]); // 如果使用SequentialAccess则需按顺序访问列,否则将抛异常,edr[0]出错。

??? }

??? while (edr.Read())

??? {

??????? Console .WriteLine(edr["UserID" ]);?? // 接着从第二条开始

?? ?????Console .WriteLine(edr[1]);

??? }

??? Console .WriteLine(ecmd.ToTraceString());

}

注:EntityCommand继承自DbCommand,所以也包括ExecuteDbDataReader、 ExecuteNonQuery 、 ExecuteReader 、 ExecuteScalar等常用方法。

?

EntityParameter 使用

代码片断:

#region EntityParameter 参数化传递

//string sqlStr = "select value u from CSharpTestEntities.Users as u order by u.UserID desc skip @start limit @end";

//conn.Open();

//EntityCommand ecmd = new EntityCommand(sqlStr, conn);

?

#region 方法1

EntityParameter p1 = new EntityParameter ("start" , DbType .Int32);

p1.Value = 2;

EntityParameter p2 = new EntityParameter ("end" , DbType .Int32);

p2.Value = 8;

ecmd.Parameters.Add(p1);

ecmd.Parameters.Add(p2);

#endregion

?

#region 方法2

ecmd.Parameters.AddWithValue("start" , 0);

ecmd.Parameters.AddWithValue("end" , 8);

#endregion

?

EntityConnectionStringBuilder 使用

代码片断:

#region EntityConnectionStringBuilder 创建连接

EntityConnectionStringBuilder esb = new ?EntityConnectionStringBuilder ();

esb.Provider = "System.Data.SqlClient" ;

esb.Metadata = @"res://*/CSharpTestEF.csdl|res://*/CSharpTestEF.ssdl|res://*/CSharpTestEF.msl" ;

esb.ProviderConnectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=CSharpTest;Integrated Security=True;MultipleActiveResultSets=True" ;

EntityConnection econn = new EntityConnection (esb.ConnectionString);

#endregion

?

补充:

#region CommandBehavior 枚举

/*

需要注意的是:CommandBehavior.SequentialAccess;这个地方。不同的枚举项,对查询会有不同影响。枚举如下:

Default 此查询可能返回多个结果集。在功能上等效于调用 ExecuteReader()。

SingleResult 查询返回一个结果集。

SchemaOnly 查询仅返回列信息。

KeyInfo 此查询返回列和主键信息。

SingleRow 查询应返回一行。

SequentialAccess 提供一种方法,以便 DataReader 处理包含带有大二进制值的列的行。

CloseConnection 在执行该命令时,如果关闭关联的 DataReader 对象,则关联的 Connection 对象也将关闭。

*/

#endregion