通过对http://www.cnblogs.com/astar的阅读,发现astar写的“Entity Framework 学习总结”能够指导我的近阶段的学习。
经过对EDM学习,下一步就是深入掌握EDM访问方法,要能理解“EntityClient + EntitySQL”、“对象服务 + EntitySQL”、“对象服务 + LINQ”三种访问方法的区别和缺劣,需要对各知识点逐一全面覆盖的学习,从而引申出后续的知识点学习步骤,EntityClient(实体框架数据提供程序),对象服务(实体框架对象的使用),ESQL、Linq(查询方法)。我要向astar学习,在将来的应用中记下一些总结和心得,供大家分享和指导。
EntityClient
EntityClient 是一种数据提供程序,实体框架应用程序使用该提供程序访问在概念模型中描述的数据,它使用其他 .NET Framework 数据提供程序访问数据源。例如,EntityClient 在访问 SQL Server 数据库时使用 SQL Server .NET Framework 数据提供程序 (SqlClient)。
使用EntityConnection来管理连接,EntityCommand来创建由Entity SQL编写的查询,EntityDataReader来执行EntityCommand并返回结果。如果需要使用事务,用EntityTransaction为 EntityCommand() 指定事务。
就不逐一对如下的知识点进行学习。
|
类 |
说明 |
|
EntityCommand |
表示要对实体数据模型 (EDM) 执行的命令。 |
|
EntityConnection |
包含对概念模型和数据源连接的引用。 此类不能被继承。 |
|
为创建和管理连接字符串(由 EntityClient 使用)的内容提供了一种简单方法。 | |
|
EntityDataReader |
从数据源读取行的一个只进流。 |
|
表示 EntityCommand 的参数。 无法继承此类。 | |
|
EntityParameterCollection |
表示与 EntityCommand 关联的参数集合。 |
|
EntityProviderFactory |
表示一组方法,这些方法用于创建提供程序对数据源类的实现的实例。 |
|
为 EntityCommand() 指定事务。 |
认识连接字符串
EntityClient 提供程序在访问 EDM 映射和元数据以及连接到数据源时将使用连接字符串。连接字符串的格式是使用分号分隔的键/值参数对列表:keyword1=value; keyword2=value;连接字符串可通过 EntityConnection 的 ConnectionString 属性访问或设置。EntityConnectionStringBuilder 类可用于以编程方式构造或访问连接字符串中的参数。下表列出了 ConnectionString 中的关键字值的有效名称:
关键字 |
说明 |
Provider |
此关键字在未指定 Name 关键字时是必需的。提供程序名称,用于检索基础提供程序的 DbProviderFactory 对象。该值为常量。如果实体连接字符串中未包含 Name 关键字,则需要一个非空 Provider 关键字值。此关键字与 Name 关键字互斥。 |
Provider Connection String |
可选项。指定传递给基础数据源的提供程序特定的连接字符串。此关键字与 Name 关键字互斥。Provider Connection String 的值必须用引号引起来。下面是一个示例:Provider Connection String ="Server=serverName; User ID = userID"; |
Metadata |
此关键字在未指定 Name 关键字时是必需的。一个由竖线分隔的目录、文件和资源位置的列表,供查找元数据和映射信息使用。此关键字与 Name 关键字互斥。下面是一个示例:metadata=res://*/NorthWindEF.csdl|res://*/NorthWindEF.ssdl|res://*/NorthWindEF.msl; |
Name |
应用程序可以选择在应用程序配置文件中指定连接名称,以用于提供所需的关键字/值连接字符串值。在此情况下,无法在连接字符串中直接提供这些值。配置文件中不允许出现 Name 关键字。如果连接字符串中未包含 Name 关键字,则需要一个非空的 Provider 关键字值。此关键字与所有其他连接字符串关键字互斥。 |
例如:connectionString="metadata=res://*/NorthWindEF.csdl|res://*/NorthWindEF.ssdl|res://*/NorthWindEF.msl;provider=System.Data.SqlClient;provider connection string="Data Source=LIJIN;Initial Catalog=Northwind;Integrated Security=True;MultipleActiveResultSets=False""
EntityConnectionStringBuilder
用程序动态创建和管理连接字符串(由 EntityClient 使用)的内容提供了一种简单方法。此节只需简单了解一下,可阅读下列示例了解其用法:
// 设置Provider.
string providerName = "System.Data.SqlClient";
//指定数据库服务器
string serverName = ".";
//指定数据库
string databaseName = "AdventureWorks";
// Initialize the connection string builder
SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder();
// Set the properties for the data source.
sqlBuilder.DataSource = serverName;
sqlBuilder.InitialCatalog = databaseName;
sqlBuilder.IntegratedSecurity = true;
// 赋值到一个字符串.
string providerString = sqlBuilder.ToString();
// Initialize the EntityConnectionStringBuilder.
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
//Set the provider name.
entityBuilder.Provider = providerName;
// Set the provider-specific connection string.
entityBuilder.ProviderConnectionString = providerString;
// Set the Metadata location.
entityBuilder.Metadata = @"res://*/AdventureWorksModel.csdl|
res://*/AdventureWorksModel.ssdl|
res://*/AdventureWorksModel.msl";
//@忽略转义字符的作用
Console.WriteLine(entityBuilder.ToString());
using (EntityConnection conn =
new EntityConnection(entityBuilder.ToString()))
{
conn.Open();
Console.WriteLine("Just testing the connection.");
conn.Close();
}
C#中的@
@忽略转义字符的作用
例如:
string s_FilePath =@"C:\Program Files\Microsoft.NET\test.txt";
相当于:
string s_FilePath ="C:\\Program Files\\Microsoft.NET\\test.txt";
@表示的字符串能够跨越数行
用于在CS中写JS或SQL代码比较方便。例如:
string s_MultiRows = @"Line1
Line2
Line3";
@ 可以作为标识符
在 C# 规范中, @ 可以作为标识符(类名、变量名、方法名等)的第一个字符,以允许C# 中保留关键字作为自己定义的标识符。例如:
class @class
{
public static void @static(bool @bool) {
if (@bool)
System.Console.WriteLine("true");
else
System.Console.WriteLine("false");
}
}
EntityTransaction
为 EntityCommand() 指定事务。EntityTransaction 从 EntityConnection 获得,并指定一个或多个 EntityCommand 对象。 EntityTransaction 会包装基础数据提供程序的事务对象的事务。直接看如下示例理解其用法:
using(EntityConnection con = new EntityConnection(connstring))
{
con.Open();
EntityTransaction transaction = con.BeginTransaction(IsolationLevel.Snapshot);//创建事务
EntityCommand cmd1 = con.CreateCommand();
cmd1.CommandText = "SELECT VALUE so FROM SalesOrders AS so";
cmd1.Transaction = transaction;
EntityDataReader r1 = cmd1.ExecuteReader();
While(r1.Read()) {
if(NeedToProcessLines(r1)) {
EntityCommand cmd2 = con.CreateCommand();
cmd2.CommandText =
"SELECT NAVIGATE(ol, OrderLine_Product).ProductName, ol.Quantity " +
"FROM OrderLines AS ol WHERE ol.OrderID = @orderID";
cmd2.Transaction = transaction;
DbDataReader r2 = cmd2.ExecuteReader();
// process r2
}
transaction.Commit();
}
IsolationLevel 枚举
指定连接的事务锁定行为。
成员名称 |
说明 | |
|
Unspecified |
正在使用与指定隔离级别不同的隔离级别,但是无法确定该级别。 当使用 OdbcTransaction 时,如果不设置 IsolationLevel 或将 IsolationLevel 设置为 Unspecified,则事务将根据由所使用的驱动程序所决定的隔离级别来执行。 |
|
Chaos |
无法覆盖隔离级别更高的事务中的挂起的更改。 |
|
ReadUncommitted |
可以进行脏读,意思是说,不发布共享锁,也不接受独占锁。 |
|
ReadCommitted |
在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻像数据。 |
|
RepeatableRead |
在查询中使用的所有数据上放置锁,以防止其他用户更新这些数据。 防止不可重复的读取,但是仍可以有幻像行。 |
|
Serializable |
在 DataSet 上放置范围锁,以防止在事务完成之前由其他用户更新行或向数据集中插入行。 |
|
Snapshot |
通过在一个应用程序正在修改数据时存储另一个应用程序可以读取的相同数据版本来减少阻止。 表示您无法从一个事务中看到在其他事务中进行的更改,即便重新查询也是如此。 |
EntityParameter
表示 EntityCommand 的参数。通过如下示例了解其用法:
using (EntityConnection conn = new EntityConnection("name=AdventureWorksEntities"))
{
conn.Open();
// Create a query that takes two parameters.
string esqlQuery =
@"SELECT VALUE Contact FROM AdventureWorksEntities.Contacts
AS Contact WHERE Contact.LastName = @ln AND
Contact.FirstName = @fn";
try
{
using (EntityCommand cmd = new EntityCommand(esqlQuery, conn))
{
// Create two parameters
EntityParameter param1 = new EntityParameter();
param1.ParameterName = "ln";
param1.Value = "Adams";
EntityParameter param2 = new EntityParameter();
param2.ParameterName = "fn";
param2.Value = "Frances";
cmd.Parameters.Add(param1);
cmd.Parameters.Add(param2);
using
(DbDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
// Iterate through the collection of Contact items.
while (rdr.Read())
{
Console.WriteLine(rdr["FirstName"]);
Console.WriteLine(rdr["LastName"]);
}
}
}
}
catch (EntityException ex)
{
Console.WriteLine(ex.ToString());
}
conn.Close();
}
附上Word版的学习文档
学习1:EDM.doc、学习2:EntityClient.doc