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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架