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