EntityFramework在三层架构中的使用
本文所有的Web页面都和以前一样,不同的是采用了三层架构。我们对应用进行了逻辑分层,各层分别为:界面层(UI),业务逻辑层(BLL)和数据访问层(DAL)。而在数据交互环境下的实体对象此时将扮演数据访问层(DAL)和业务逻辑层(BLL)数据传输的对象(DTO)。在以前,我们可能需要花时间编写DTO的代码,而现在EF4能帮我们省去这一部分时间了。
好吧,下面跟随我的步骤一起完成这个应用。
步骤1.创建数据库
为可简单起见,我们在SQL Server中新建一个OrderSystem数据库,并且创建一个单独的表UserAccounts,该表的字段如下,注意将Id作为主键,并设置为标识列以便自增。
仍然采用存储过程操作表的数据,我们创建的存储过程如下:
1.UserAccounts_SelectAll查询表中所有数据
view plaincopy to clipboardprint?
CREATE PROCEDURE [dbo].[UserAccounts_SelectAll]
AS
SET NOCOUNT ON
SELECT Id, FirstName, LastName, AuditFields_InsertDate, AuditFields_UpdateDate
FROM UserAccounts
RETURN
CREATE PROCEDURE [dbo].[UserAccounts_SelectAll]
AS
SET NOCOUNT ON
SELECT Id, FirstName, LastName, AuditFields_InsertDate, AuditFields_UpdateDate
FROM UserAccounts
RETURN2.UserAccounts_SelectById通过Id查询单条表数据
view plaincopy to clipboardprint?
CREATE PROCEDURE [dbo].[UserAccounts_SelectById]
(
@Id int
)
AS
SET NOCOUNT ON
SELECT Id, FirstName, LastName, AuditFields_InsertDate, AuditFields_UpdateDate
FROM UserAccounts
WHERE Id = @Id
RETURN
CREATE PROCEDURE [dbo].[UserAccounts_SelectById]
(
@Id int
)
AS
SET NOCOUNT ON
SELECT Id, FirstName, LastName, AuditFields_InsertDate, AuditFields_UpdateDate
FROM UserAccounts
WHERE Id = @Id
RETURN
3.UserAccounts_Insert插入一条表数据
view plaincopy to clipboardprint?
CREATE PROCEDURE [dbo].[UserAccounts_Insert]
(
@FirstName nvarchar(50),
@LastName nvarchar(50),
@AuditFields_InsertDate datetime,
@AuditFields_UpdateDate datetime
)
AS
INSERT INTO UserAccounts (FirstName, LastName, AuditFields_InsertDate,
AuditFields_UpdateDate)
VALUES (@FirstName, @LastName, @AuditFields_InsertDate,
@AuditFields_UpdateDate)
SELECT CAST(SCOPE_IDENTITY() AS INT) AS Id
CREATE PROCEDURE [dbo].[UserAccounts_Insert]
(
@FirstName nvarchar(50),
@LastName nvarchar(50),
@AuditFields_InsertDate datetime,
@AuditFields_UpdateDate datetime
)
AS
INSERT INTO UserAccounts (FirstName, LastName, AuditFields_InsertDate,
AuditFields_UpdateDate)
VALUES (@FirstName, @LastName, @AuditFields_InsertDate,
@AuditFields_UpdateDate)
SELECT CAST(SCOPE_IDENTITY() AS INT) AS Id4.UserAccounts_Update更新单条表数据
view plaincopy to clipboardprint?
CREATE PROCEDURE [dbo].[UserAccounts_Update]
(
@Id int,
@FirstName nvarchar(50),
@LastName nvarchar(50),
@AuditFields_UpdateDate datetime
)
AS
SET NOCOUNT ON
UPDATE UserAccounts
SET FirstName = @FirstName,
LastName = @LastName,
AuditFields_UpdateDate = @AuditFields_UpdateDate
WHERE Id = @Id
RETURN
CREATE PROCEDURE [dbo].[UserAccounts_Update]
(
@Id int,
@FirstName nvarchar(50),
@LastName nvarchar(50),
@AuditFields_UpdateDate datetime
)
AS
SET NOCOUNT ON
UPDATE UserAccounts
SET FirstName = @FirstName,
LastName = @LastName,
AuditFields_UpdateDate = @AuditFields_UpdateDate
WHERE Id = @Id
RETURN5.UserAccounts_Delete删除单条表数据
view plaincopy to clipboardprint?
CREATE PROCEDURE [dbo].[UserAccounts_Delete]
(
@Id int
)
AS
SET NOCOUNT ON
DELETE
FROM UserAccounts
WHERE Id = @Id
RETURN
CREATE PROCEDURE [dbo].[UserAccounts_Delete]
(
@Id int
)
AS
SET NOCOUNT ON
DELETE
FROM UserAccounts
WHERE Id = @Id
RETURN步骤2.创建数据访问层
下来在VS 2010中创建一个新的类库项目,它将作为数据访问层。
1.打开VS,选择文件->新项目。
2.选择“C#类库”项目,将名字改为OrederSystemDAL
3.选中“为项目创建目录”,将左边输入框内容改为“OrderSystem”,点“OK”。
4.添加数据视图模型,OrderSystemDAL项目上右键,选择Add->New Item..
5.从项目模板中选择“ADO.NET Entity Data Mode”,将它名字改为“OrderSystemDataModel.edmx”,点“Add”。
6.将会看到视图数据模型向导,选择“Generate from database”,点“Next”。
7.选择数据库连接,我们创建一个新连接,选择“New connection”,填写好登陆信息并选择OrderSystem数据后,点“OK”,再点“Next”。
8.选择数据库对象,选择刚创建的UserAccounts表和5个存储过程,点“Finish”。
接下来是创建调用这些存储过程的方法了。
9.展开存储过程文件夹,右击“UserAccounts_Delete”存储过程,选择“ Add Function Import”。
10.弹出“Function Import”框后,保持默认参数,点击“OK”。
11.UserAccounts_Insert存储过程上右击,由于它将返回新插入的数据的Id,所以我们要将“Returns a Collection Of”的Scalars参数设置为Int32,然后点“OK”。
12.对其他存储过程重复同样操作,对于SelectAll 和SelectById存储过程,“Returns a Collection Of”中的Entity参数设置为UserAccount,Update存储过程保持默认即可。
实体数据模型就创建好了,下面要在数据访问层中创建一个类来管理这些存储过程的调用。
13.添加一个新的类文件,将其名字改为“UserAccountsData.cs”,将类声明为公共的和静态的。
view plaincopy to clipboardprint?
public static class UserAccountsData
public static class UserAccountsData14.给类添加以下方法:
view plaincopy to clipboardprint?
public static int Insert(string firstName, string lastName, DateTime insertDate)
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
return Insert(db, firstName, lastName, insertDate);
}
}
public static int Insert(OrderSystemEntities db, string firstName,
string lastName, DateTime insertDate)
{
return db.UserAccounts_Insert(firstName, lastName, insertDate, insertDate).ElementAt(0).Value;
}
public static void Update(int id, string firstName, string lastName,
DateTime updateDate)
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
Update(db, id, firstName, lastName, updateDate);
}
}
public static void Update(OrderSystemEntities db, int id, string firstName,
string lastName, DateTime updateDate)
{
db.UserAccounts_Update(id, firstName, lastName, updateDate);
}
public static void Delete(int id)
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
Delete(db, id);
}
}
public static void Delete(OrderSystemEntities db, int id)
{
db.UserAccounts_Delete(id);
}
public static UserAccount SelectById(int id)
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
return SelectById(db, id);
}
}
public static UserAccount SelectById(OrderSystemEntities db, int id)
{
return db.UserAccounts_SelectById(id).ElementAtOrDefault(0);
}
public static List<UserAccount> SelectAll()
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
return SelectAll(db);
}
}
public static List<UserAccount> SelectAll(OrderSystemEntities db)
{
return db.UserAccounts_SelectAll().ToList();
}
public static int Insert(string firstName, string lastName, DateTime insertDate)
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
return Insert(db, firstName, lastName, insertDate);
}
}
public static int Insert(OrderSystemEntities db, string firstName,
string lastName, DateTime insertDate)
{
return db.UserAccounts_Insert(firstName, lastName, insertDate, insertDate).ElementAt(0).Value;
}
public static void Update(int id, string firstName, string lastName,
DateTime updateDate)
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
Update(db, id, firstName, lastName, updateDate);
}
}
public static void Update(OrderSystemEntities db, int id, string firstName,
string lastName, DateTime updateDate)
{
db.UserAccounts_Update(id, firstName, lastName, updateDate);
}
public static void Delete(int id)
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
Delete(db, id);
}
}
public static void Delete(OrderSystemEntities db, int id)
{
db.UserAccounts_Delete(id);
}
public static UserAccount SelectById(int id)
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
return SelectById(db, id);
}
}
public static UserAccount SelectById(OrderSystemEntities db, int id)
{
return db.UserAccounts_SelectById(id).ElementAtOrDefault(0);
}
public static List<UserAccount> SelectAll()
{
using (OrderSystemEntities db = new OrderSystemEntities())
{
return SelectAll(db);
}
}
public static List<UserAccount> SelectAll(OrderSystemEntities db)
{
return db.UserAccounts_SelectAll().ToList();
}
以上就是我们用来操作UserAccounts表数据的类了。
步骤3.创建业务逻辑层
业务逻辑层是介于界面层和数据访问层的,它体现了应用的业务逻辑和一些数据验证规则。
1.添加一个新的C#类库项目,将它的名字改为“OrderSystemBLL”
2.给该项目添加DAL项目引用和System.Data.Entity引用。
3.将项目中的“Class1.cs”文件改名为“UserAccountEO”。EO的意思编辑对象(Edit Object),添加EO后缀是为了将其和数据访问层的类区分开。
4.添加命名空间。
view plaincopy to clipboardprint?
using System.Collections;
using OrderSystemDAL;
using System.Collections;
using OrderSystemDAL;5.添加属性声明
view plaincopy to clipboardprint?
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime InsertDate { get; set; }
public DateTime UpdateDate { get; set; }
public string FullName
{
get
{
return LastName + ", " + FirstName;
}
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime InsertDate { get; set; }
public DateTime UpdateDate { get; set; }
public string FullName
{
get
{
return LastName + ", " + FirstName;
}
}6.添加下面的代码用来将数据保持到数据库,该方法根据对象Id是否赋值来判断是更新还是插入操作,并且还会进行一系列的验证,如果验证不通过,则不能进行数据的插入或更新,相关的错误还会返回给它的调用者。
view plaincopy to clipboardprint?
public bool Save(ref ArrayList validationErrors)
{
ValidateSave(ref validationErrors);
if (validationErrors.Count == 0)
{
if (Id == 0)
{
Id = UserAccountsData.Insert(FirstName, LastName, DateTime.Now);
}
else
{
UserAccountsData.Update(Id, FirstName, LastName, DateTime.Now);
}
return true;
}
else
{
return false;
}
}
private void ValidateSave(ref ArrayList validationErrors)
{
if (FirstName.Trim() == "")
{
validationErrors.Add("The First Name is required.");
}
if (LastName.Trim() == "")
{
validationErrors.Add("The Last Name is required.");
}
}
public bool Save(ref ArrayList validationErrors)
{
ValidateSave(ref validationErrors);
if (validationErrors.Count == 0)
{
if (Id == 0)
{
Id = UserAccountsData.Insert(FirstName, LastName, DateTime.Now);
}
else
{
UserAccountsData.Update(Id, FirstName, LastName, DateTime.Now);
}
return true;
}
else
{
return false;
}
}
private void ValidateSave(ref ArrayList validationErrors)
{
if (FirstName.Trim() == "")
{
validationErrors.Add("The First Name is required.");
}
if (LastName.Trim() == "")
{
validationErrors.Add("The Last Name is required.");
}
}7.添加用来删除数据的方法,如果要进行验证可以采取如下的方式
view plaincopy to clipboardprint?
public void Delete(ref ArrayList validationErrors)
{
ValidateDelete(ref validationErrors);
if (validationErrors.Count == 0)
{
UserAccountsData.Delete(Id);
}
}
private void ValidateDelete(ref ArrayList validationErrors)
{
//Check for referential integrity.
}
public void Delete(ref ArrayList validationErrors)
{
ValidateDelete(ref validationErrors);
if (validationErrors.Count == 0)
{
UserAccountsData.Delete(Id);
}
}
private void ValidateDelete(ref ArrayList validationErrors)
{
//Check for referential integrity.
}8.添加用来查询单条数据的方法
view plaincopy to clipboardprint?
public bool Select(int id)
{
UserAccount userAccount = UserAccountsData.SelectById(id);
if (userAccount != null)
{
MapData(userAccount);
return true;
}
else
{
return false;
}
}
internal void MapData(UserAccount userAccount)
{
Id = userAccount.Id;
FirstName = userAccount.FirstName;
LastName = userAccount.LastName;
InsertDate = userAccount.AuditFields_InsertDate;
UpdateDate = userAccount.AuditFields_UpdateDate;
}
public bool Select(int id)
{
UserAccount userAccount = UserAccountsData.SelectById(id);
if (userAccount != null)
{
MapData(userAccount);
return true;
}
else
{
return false;
}
}
internal void MapData(UserAccount userAccount)
{
Id = userAccount.Id;
FirstName = userAccount.FirstName;
LastName = userAccount.LastName;
InsertDate = userAccount.AuditFields_InsertDate;
UpdateDate = userAccount.AuditFields_UpdateDate;
}9.最后是查询表所有数据的方法
view plaincopy to clipboardprint?
public static List<UserAccountEO> SelectAll()
{
List<UserAccountEO> userAccounts
= new List<UserAccountEO>();
List<UserAccountEO> userAccountDTOs = UserAccountsData.SelectAll();
foreach (UserAccount userAccountDTO in userAccountDTOs)
{
UserAccountEO userAccountEO = new UserAccountEO();
userAccountEO.MapData(userAccountDTO);
userAccounts.Add(userAccountEO);
}
return userAccounts;
}
public static List<UserAccountEO> SelectAll()
{
List<UserAccountEO> userAccounts
= new List<UserAccountEO>();
List<UserAccountEO> userAccountDTOs = UserAccountsData.SelectAll();
foreach (UserAccount userAccountDTO in userAccountDTOs)
{
UserAccountEO userAccountEO = new UserAccountEO();
userAccountEO.MapData(userAccountDTO);
userAccounts.Add(userAccountEO);
}
return userAccounts;
}
步骤4.创建Web表单
下面就是创建数据增删改查的页面了,就是我们所说的界面层
1.新建一个ASP.NET Web项目,命名为“OrderSystemUI”。
2.为该项目添加OrderSystemBLL项目的引用。
3.在web.config中添加connectionStrings配置节,代码如下:
view plaincopy to clipboardprint?
<connectionstrings>
<add name="OrderSystemEntities" connectionstring="你的数据库连接字符串"
providername="System.Data.EntityClient" />
</connectionstrings>
<connectionstrings>
<add name="OrderSystemEntities" connectionstring="你的数据库连接字符串"
providername="System.Data.EntityClient" />
</connectionstrings>
4.添加一个WebForm,命名为“Users.aspx”。
5.转到代码视图,在div之间添加如下html代码
view plaincopy to clipboardprint?
<table>
<tbody>
<tr>
<td colspan="2">
<asp :label id="lblErrorLabel" runat="server" text="Please correct the following issues:" forecolor="Red" visible="false"></asp>
<asp :label id="lblErrorMessages" runat="server" forecolor="Red" visible="false"></asp>
</td>
</tr>
<tr>
<td>Select A User:</td>
<td><asp :dropdownlist id="ddlUsers" runat="server" autopostback="True"></asp></td>
</tr>
<tr>
<td>First Name:</td>
<td><asp :textbox id="txtFirstName" runat="server"></asp></td>
</tr>
<tr>
<td>Last Name:</td>
<td><asp :textbox id="txtLastName" runat="server"></asp></td>
</tr><tr>
<td>Inserted:</td><td><asp :label id="lblInserted" runat="server"></asp></td>
</tr><tr><td>Updated:</td>
<td><asp :label id="lblUpdated" runat="server"></asp></td>
</tr>
</tbody>
</table>
<asp :button id="btnSave" runat="server" text="Save" />
<asp :button id="btnDelete" runat="server" text="Delete" />
<table>
<tbody>
<tr>
<td colspan="2">
<asp :label id="lblErrorLabel" runat="server" text="Please correct the following issues:" forecolor="Red" visible="false"></asp>
<asp :label id="lblErrorMessages" runat="server" forecolor="Red" visible="false"></asp>
</td>
</tr>
<tr>
<td>Select A User:</td>
<td><asp :dropdownlist id="ddlUsers" runat="server" autopostback="True"></asp></td>
</tr>
<tr>
<td>First Name:</td>
<td><asp :textbox id="txtFirstName" runat="server"></asp></td>
</tr>
<tr>
<td>Last Name:</td>
<td><asp :textbox id="txtLastName" runat="server"></asp></td>
</tr><tr>
<td>Inserted:</td><td><asp :label id="lblInserted" runat="server"></asp></td>
</tr><tr><td>Updated:</td>
<td><asp :label id="lblUpdated" runat="server"></asp></td>
</tr>
</tbody>
</table>
<asp :button id="btnSave" runat="server" text="Save" />
<asp :button id="btnDelete" runat="server" text="Delete" />
转到设计视图,可以看到效果如下:
步骤5.将查询的数据加载到Drop Down List
下面要做的是在页面加载时,将UserAccounts表的数据加载到Drop Down List,同时可以在Drop Down List中选择新增数据。
1.双击页面,创建Page_Load时间处理方法。
2.添加命名空间using OrderSystemBLL;。
3.Page_Load处理方法代码如下:
view plaincopy to clipboardprint?
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LoadUserDropDownList();
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
LoadUserDropDownList();
}
}4.添加LoadUserDropDownList方法
view plaincopy to clipboardprint?
private void LoadUserDropDownList()
{
ddlUsers.DataSource = UserAccountEO.SelectAll();
ddlUsers.DataTextField = "FullName";
ddlUsers.DataValueField = "Id";
ddlUsers.DataBind();
ddlUsers.Items.Insert(0, new ListItem("Create New User", ""));
}
private void LoadUserDropDownList()
{
ddlUsers.DataSource = UserAccountEO.SelectAll();
ddlUsers.DataTextField = "FullName";
ddlUsers.DataValueField = "Id";
ddlUsers.DataBind();
ddlUsers.Items.Insert(0, new ListItem("Create New User", ""));
}步骤6.插入和更新数据
设计视图下,双击“Save”按钮,添加点击事件处理代码如下:
view plaincopy to clipboardprint?
protected void btnSave_Click(object sender, EventArgs e)
{
ArrayList validationErrors = new ArrayList();
UserAccountEO userAccount = new UserAccountEO();
if (ddlUsers.SelectedItem.Value != "")
{
//Updating
userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
}
userAccount.FirstName = txtFirstName.Text;
userAccount.LastName = txtLastName.Text;
userAccount.Save(ref validationErrors);
if (validationErrors.Count > 0)
{
ShowValidationMessages(validationErrors);
}
else
{
//Reload the drop down list
LoadUserDropDownList();
//Select the one the user just saved.
ddlUsers.Items.FindByValue(userAccount.Id.ToString()).Selected = true;
lblErrorLabel.Visible = false;
lblErrorMessages.Visible = false;
}
}
private void ShowValidationMessages(ArrayList validationErrors)
{
if (validationErrors.Count > 0)
{
lblErrorLabel.Visible = true;
lblErrorMessages.Visible = true;
lblErrorMessages.Text = "<br>";
foreach (string message in validationErrors)
{
lblErrorMessages.Text += message + "<br>";
}
}
else
{
lblErrorLabel.Visible = false;
lblErrorMessages.Visible = false;
}
}
protected void btnSave_Click(object sender, EventArgs e)
{
ArrayList validationErrors = new ArrayList();
UserAccountEO userAccount = new UserAccountEO();
if (ddlUsers.SelectedItem.Value != "")
{
//Updating
userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
}
userAccount.FirstName = txtFirstName.Text;
userAccount.LastName = txtLastName.Text;
userAccount.Save(ref validationErrors);
if (validationErrors.Count > 0)
{
ShowValidationMessages(validationErrors);
}
else
{
//Reload the drop down list
LoadUserDropDownList();
//Select the one the user just saved.
ddlUsers.Items.FindByValue(userAccount.Id.ToString()).Selected = true;
lblErrorLabel.Visible = false;
lblErrorMessages.Visible = false;
}
}
private void ShowValidationMessages(ArrayList validationErrors)
{
if (validationErrors.Count > 0)
{
lblErrorLabel.Visible = true;
lblErrorMessages.Visible = true;
lblErrorMessages.Text = "";
foreach (string message in validationErrors)
{
lblErrorMessages.Text += message + "";
}
}
else
{
lblErrorLabel.Visible = false;
lblErrorMessages.Visible = false;
}
}这里代码和以前的代码不同之处是,多了一些验证的处理。
步骤7.查询数据
设计视图下,双击下拉框,给它添加SelectedIndexChanged事件处理方法,代码如下:
view plaincopy to clipboardprint?
txtFirstName.Text = "";
txtLastName.Text = "";
lblInserted.Text = "";
lblUpdated.Text = "";
if (ddlUsers.SelectedValue != "")
{
int userAccountId = Convert.ToInt32(ddlUsers.SelectedValue);
UserAccountEO userAccount = new UserAccountEO();
if (userAccount.Select(userAccountId))
{
txtFirstName.Text = userAccount.FirstName;
txtLastName.Text = userAccount.LastName;
lblInserted.Text = userAccount.InsertDate.ToString();
lblUpdated.Text = userAccount.UpdateDate.ToString();
}
}
txtFirstName.Text = "";
txtLastName.Text = "";
lblInserted.Text = "";
lblUpdated.Text = "";
if (ddlUsers.SelectedValue != "")
{
int userAccountId = Convert.ToInt32(ddlUsers.SelectedValue);
UserAccountEO userAccount = new UserAccountEO();
if (userAccount.Select(userAccountId))
{
txtFirstName.Text = userAccount.FirstName;
txtLastName.Text = userAccount.LastName;
lblInserted.Text = userAccount.InsertDate.ToString();
lblUpdated.Text = userAccount.UpdateDate.ToString();
}
}步骤8.删除数据
视图设计下,双击“Delete”按钮,给它添加点击事件处理方法,代码如下:
view plaincopy to clipboardprint?
if (ddlUsers.SelectedItem.Value != "")
{
ArrayList validationErrors = new ArrayList();
UserAccountEO userAccount = new UserAccountEO();
userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
userAccount.Delete(ref validationErrors);
if (validationErrors.Count > 0)
{
ShowValidationMessages(validationErrors);
}
else
{
LoadUserDropDownList();
txtFirstName.Text = "";
txtLastName.Text = "";
lblInserted.Text = "";
lblUpdated.Text = "";
lblErrorLabel.Visible = false;
lblErrorMessages.Visible = false;
}
}
if (ddlUsers.SelectedItem.Value != "")
{
ArrayList validationErrors = new ArrayList();
UserAccountEO userAccount = new UserAccountEO();
userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
userAccount.Delete(ref validationErrors);
if (validationErrors.Count > 0)
{
ShowValidationMessages(validationErrors);
}
else
{
LoadUserDropDownList();
txtFirstName.Text = "";
txtLastName.Text = "";
lblInserted.Text = "";
lblUpdated.Text = "";
lblErrorLabel.Visible = false;
lblErrorMessages.Visible = false;
}
}
总结
至此,如何在三层架构中使用EF4就像想你介绍完了,它应该能满足一般应用的要求。在EF4结合VS2010后,我们发现一个最大的好处是DTO对象不再需要我们自己编写了,加上调用存储过程智能感知的支持,确实非常方便。
从此学习网 http://www.congci.com
相关推荐
在本实例中,我们将探讨如何在ASP.NET 3.5环境中利用Entity Framework实现一个三层架构的应用。 在三层架构中,通常包括表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data ...
在本项目中,我们将使用Entity Framework(EF)作为数据访问技术,实现一个简单的三层架构。 **表示层(UI)** 表示层是用户与系统交互的部分,通常由Web页面或Windows应用程序组成。在这个项目中,UI层可能包含ASP...
本示例"简单三层Entity Framework Demo"旨在演示如何使用Entity Framework(简称EF)在.NET环境中构建一个基于三层架构的应用程序。Entity Framework是一种对象关系映射(ORM)工具,它允许开发者以面向对象的方式来...
在三层架构中,数据访问层(DAL)负责与数据库交互,提供对数据的增删改查等基本操作。在本项目中,"Entity.DAL"可能是包含这些操作的代码库。"Entity.Model"可能包含了实体类,这些类对应于数据库中的表结构。 ...
在实际开发中,这三者组合使用时,开发者首先需要在项目中引用EntityFramework.dll,然后配置Oracle数据库相关的连接字符串。接着,通过Oracle.ManagedDataAccess.EntityFramework.dll,开发者可以创建数据库上下文...
- **背景**:Entity Framework (EF) 是 Microsoft 推出的一款 ORM (Object Relational Mapping) 工具,旨在简化数据访问层的开发,减少编写传统数据访问层所需的大量重复代码。自 .NET Framework 3.5 SP1 开始引入 ...
Entity Framework通过提供一种高级数据访问抽象层,使得开发人员可以使用对象模型来处理数据库操作。它支持ADO.NET Entity Data Model(EDM),这是一个统一的数据模型,可以代表各种不同类型的数据库。通过EF,...
在这个Entity Framework教程中,我们将深入探讨其核心概念和技术。 预备知识部分主要介绍了LINQ(Language Integrated Query,语言集成查询)技术,这是.NET 3.5引入的重要特性,允许开发者使用类似SQL的语法在C#或...
- **事务处理**:Oracle支持分布式事务,开发者需要了解如何在EF中使用事务来确保数据一致性。 - **性能优化**:由于Oracle数据库的特性,可能需要对查询进行优化,比如使用存储过程、批处理操作,或者使用Oracle...
通过这种方式,开发者可以利用ASP.NET构建用户界面,WCF提供远程服务接口,而Entity Framework则负责数据层的抽象和管理,实现三层架构的解耦和模块化设计。 总结来说,ASP.NET、WCF和Entity Framework的组合为.NET...
在 Entity Framework 4.1 中,引入了 DbContext API,它比旧的 ObjectContext 更加简洁、易用,更适合分层架构。DbContext 提供了对数据库的操作,如添加、删除、保存更改等,同时支持 LINQ 查询,使得数据库交互...
采用三层架构设计 持久层采用Entity Framework实现,并进行了大量有价值的封装,操作更简易 业务层事务封装 环境说明: 1.MySql5以上版本 2.需要安装MySql for Net驱动【有提供】 3.IDE:VS2010
在ASP.NET应用中,EF通常作为数据访问层的实现,配合Controller和View实现MVC架构。在Controller中调用DbContext的方法获取数据,然后传递给View展示,或者接收View的输入,调用DbContext更新数据。 **五、DBA角色...
在本示例中,项目结构分为三个主要部分:DAL(数据访问层)、Model(模型层)和 Web(表示层或控制器)。这种分层设计有助于代码的组织和复用,提高代码的可读性和可维护性。 1. **数据访问层 (DAL)**:这一层主要...
接下来,文档深入到Entity Framework的核心概念,如EDM(实体数据模型)的概述,以及EDM的三个主要组成部分:CSDL(概念架构定义语言)、SSDL(存储架构定义语言)、MSL(映射规范语言)。文档还讨论了EDM中存储过程...
EF4不直接支持批量操作,但可以通过扩展方法或第三方库如EntityFramework.Extended来实现,以提高性能。 ## 性能优化 1. **延迟加载**:默认情况下,EF4启用延迟加载,即只有在需要时才加载关联的数据。若不需要,...
7. **n层架构中的Entity Framework使用**:包括ASP.NET应用和客户端应用。这部分内容帮助开发者理解如何在不同层级的应用程序中有效利用Entity Framework。 8. **异常处理**:讨论了如何处理Entity Framework中...
- **定义**:Entity Framework(简称 EF)是一种更通用、功能更强大的 ORM 工具,由 ADO.NET 团队开发,并在 .NET Framework 3.5 Service Pack 1 中首次推出。它支持多种数据库,并提供了一个更高级别的抽象层次。 -...