Entity Framework — ( Database First )

什么是Entity Framework

Entity Framework是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案。将数据存储从域对象自动映射到关系型数据库,让开发人员节不需要编写大量的数据访问代码,节省了数据库访问的代码时间,对数据库操作如同操作Object对象一样省事。

Entity Framework在使用当中有3中模式,分别是Code FirstModel First以及Database First

由于我最早接触的是Database First这种模式,所以首先我们就来了解一下Database First模式的基本用法。

创建一个数据库

Database First顾名思意就是首先需要一个存在的数据库,所以这里需要创建一个数据库。

这里我们还是以Product为例。

Entity Framework — ( Database First )

Product表包含以下字段。

Entity Framework — ( Database First )

创建Console Application

我们为了方便简单点,这里我们创建一个Console Application程序。

VS中选择创建一个Console Application程序。

Entity Framework — ( Database First )

创建ADO.NET Entity Data Model

这里我们选择ADO.NET Entity Data Model,命名为Product,后缀为.edmx文件。

Entity Framework — ( Database First )

点击Add按钮,弹出下面的向导框,选择Generate from database,也就是我们需要的Database First模式。

Entity Framework — ( Database First )

点击Next按钮,来到以下向导框中,选择我们之前创建的数据库,并为这个Entity Connection命名为ProductContext

Entity Framework — ( Database First )

继续点击Next按钮,来到以下向导框中,选择我们需要添加的表,并输入一个Model Namespace

Entity Framework — ( Database First )

点击Finish按钮,创建成功后我们可以看到自动安装了EntityFramwork的参考引用,还有我们创建的名为Product.edmx的文件。

Entity Framework — ( Database First )

双击打开Product.edmx文件,可以看到我们选择的Product表也加载映射到了文件当中。

Entity Framework — ( Database First )

基本的CRUD操作

下面我们开始在控制台程序里对Product表数据进行简单CRUD操作,打开Program.cs文件,在Main方法里编写CRUD代码,这里我们插入两条数据Product NameProduct AProduct B,修改Product NameProduct A的记录,删除Product NameProduct B的记录。

代码如下:

        static void Main(string[] args)
{
using (var productContext = new ProductContext())
{
// Create
Console.WriteLine("创建两个Product. Product A and Product B.");
var productList = new List<Product>{
new Product
{
ProductName = "Product A",
Price = ,
Count = ,
Description = "Description A"
},
new Product
{
ProductName = "Product B",
Price = ,
Count = ,
Description = "Description B"
}
};
productContext.Product.AddRange(productList);
productContext.SaveChanges();
Console.WriteLine("创建成功.");
// Display
Console.WriteLine("显示当前所有Product.");
var products = productContext.Product.ToList();
foreach (var item in products)
{
Console.WriteLine("{0} {1} {2} {3} {4}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description);
}
Console.WriteLine(); // Update
Console.WriteLine("修改Product A为Product AAA.");
var productUpdate = productContext.Product.Where(p => p.ProductName == "Product A").FirstOrDefault();
if (productUpdate != null)
{
productUpdate.ProductName = "Product AAA";
productContext.Entry(productUpdate).State = EntityState.Modified;
productContext.SaveChanges();
Console.WriteLine("修改成功.");
} // Display
Console.WriteLine("显示当前所有Product.");
products = productContext.Product.ToList();
foreach (var item in products)
{
Console.WriteLine("{0} {1} {2} {3} {4}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description);
}
Console.WriteLine(); // Delete
Console.WriteLine("删除Product B.");
var productDelete = productContext.Product.Where(p => p.ProductName == "Product B").FirstOrDefault();
if (productContext != null)
{
productContext.Product.Remove(productDelete);
productContext.SaveChanges();
Console.WriteLine("删除成功.");
} // Display
Console.WriteLine("显示当前所有Product.");
products = productContext.Product.ToList();
foreach (var item in products)
{
Console.WriteLine("{0} {1} {2} {3} {4}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description);
} Console.ReadKey();
}
}

运行代码,效果如下图。

Entity Framework — ( Database First )

数据库表变化、视图、存储过程等基本操作

我们在项目开发阶段,有时候会遇到一些表后期需要加一些字段,那么我们来看看如果更新这些表的变化。

这里我们假如需要知道每个产品归属一个公司,那么我们需要新增一个公司Company表,并且在Product表新增一个CompanyID的字段,与Company表形成对应。

Entity Framework — ( Database First )

新增了一个Company表并且修改了Product表,接下来我们要更新我们的Entity Data Model。打开Product.edmx文件,右键单击选择Update Model from Database

Entity Framework — ( Database First )

在弹出的向导框中,分别选择Add我们新建的Company表和Refresh我们修改的Product表。

Entity Framework — ( Database First )

Entity Framework — ( Database First )

点击Finish按钮。我们看到新建的Company表和修改的Product表都更新到了Model当中。

Entity Framework — ( Database First )

当我们在实际项目当中,有时候在做复杂的处理,比如需要更新多个表的内容,或者需要多个表联合查询的数据,我们可能更多的需要视图和存储过程来完成,那么这里我们看看如何加载视图和存储过程以及怎么调用它们。

首先我们简单的建立一个视图和一个存储过程。

CREATE VIEW [dbo].[vProductAndCompany]
AS
SELECT dbo.Product.ProductID, dbo.Product.ProductName, dbo.Product.Count, dbo.Product.Price, dbo.Product.Description, dbo.Company.CompanyName
FROM dbo.Product LEFT OUTER JOIN
dbo.Company ON dbo.Product.CompanyID = dbo.Company.CompanyID GO
CREATE  PROCEDURE [dbo].[spSaveOrUpdateProduct](
@ProductID int,
@ProductName nvarchar(),
@Price decimal(,),
@Count int,
@Description nvarchar(max),
@CompanyID int
)
AS
BEGIN
declare @CurrentProductID int
if exists(select ProductID from Product where ProductID=@ProductID)
begin
update Product set
ProductName=@ProductName,
Price=@Price,
[Count]=@Count,
[Description]=@Description,
CompanyID=@CompanyID
where ProductID=@ProductID set @CurrentProductID=@ProductID end
else
begin
insert into Product(ProductName,Price,[Count],[Description],CompanyID)
values(@ProductName,@Price,@Count,@Description,@CompanyID) set @CurrentProductID=cast(SCOPE_IDENTITY() as int);
end select @CurrentProductID as [RowCount]
END

接下来我们同样打开Product.edmx文件,右键单击选择Update Model from Database。在向导框中选择我们新建的视图和存储过程。
Entity Framework — ( Database First )

点击Finish按钮,我们可以看到新建的视图vProductAndCompany也更新到了Model中。

Entity Framework — ( Database First )

那么如何看到新增的存储过程到哪里了,我们依旧打开Product.edmx文件,右键单击选择Model Browser

Entity Framework — ( Database First )

我们看到右侧的Model BrowserFunction Imports下就是我们新增的存储过程,双击打开图中可以编辑它的名称以及返回值类型等。

Entity Framework — ( Database First )

接下来我们就可以来操作视图以及存储过程了。

首先,先准备一些测试数据,分别向Product表和Company表中插入一些数据。

 -- Company
insert into Company(CompanyName) values('Company A')
insert into Company(CompanyName) values('Company B')
insert into Company(CompanyName) values('Company C') -- Product
insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product A',,,'Description A',)
insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product B',,,'Description B',)
insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product C',,,'Description C',)
insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product D',,,'Description D',)
insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product E',,,'Description E',)

接着,我们代码实现调用存储新增一条Product数据,并且调用视图显示全部视图数据。

                Console.WriteLine("显示当前所有Product.");
var products = productContext.vProductAndCompany.ToList();
foreach (var item in products)
{
Console.WriteLine("{0} {1} {2} {3} {4} {5}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description, item.CompanyName);
} Console.WriteLine("新增一个Product.名为Product F");
var newProduct = new Product
{
ProductID = ,
ProductName = "Product F",
Price = ,
Count = ,
Description = "Description F",
CompanyID =
};
var result = productContext.spSaveOrUpdateProduct(newProduct.ProductID, newProduct.ProductName, newProduct.Price, newProduct.Count, newProduct.Description, newProduct.CompanyID);
foreach (int returnValue in result)
{
if (returnValue > )
{
Console.WriteLine("新增成功.");
}
} Console.WriteLine("显示当前所有Product.");
products = productContext.vProductAndCompany.ToList();
foreach (var item in products)
{
Console.WriteLine("{0} {1} {2} {3} {4} {5}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description, item.CompanyName);
}
Console.ReadKey();

运行程序,结果如下。
Entity Framework — ( Database First )

另外,除了通过以上方式来对数据库数据操作之外,当然也可以直接用SQL命令。

                var strQuery = "select ProductID,ProductName,Count,Price,Description,CompanyID from Product";
var products = productContext.Database.SqlQuery<Product>(strQuery).ToList();
Console.WriteLine("显示当前Product集合数据.");
foreach (var item in products)
{
Console.WriteLine("{0} {1} {2} {3} {4} {5}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description, item.CompanyID);
}
Console.WriteLine(); Console.WriteLine("更新Product F为Product FFF.");
string newProductName = "Product FFF";
var strCommand = string.Format("update Product set ProductName='{0}' where ProductID=6", newProductName);
var result = productContext.Database.ExecuteSqlCommand(strCommand);
Console.WriteLine("更新成功.");
Console.WriteLine(); products = productContext.Database.SqlQuery<Product>(strQuery).ToList();
Console.WriteLine("显示更新后的Product集合数据.");
foreach (var item in products)
{
Console.WriteLine("{0} {1} {2} {3} {4} {5}", item.ProductID, item.ProductName, item.Price, item.Count, item.Description, item.CompanyID);
} Console.ReadKey();

运行程序,结果如下。
Entity Framework — ( Database First )

这里我们简单的列举一下查询和更新,其他操作类似,这里就不一一介绍了。

好了,本篇就先到此,希望对你有所帮助,谢谢!

上一篇:JS组件系列——Bootstrap 树控件使用经验分享


下一篇:策略模式与SPI机制,到底有什么不同?