Entity Framework — ( Database First )
什么是Entity Framework
Entity Framework是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案。将数据存储从域对象自动映射到关系型数据库,让开发人员节不需要编写大量的数据访问代码,节省了数据库访问的代码时间,对数据库操作如同操作Object对象一样省事。
Entity Framework在使用当中有3中模式,分别是Code First,Model First以及Database First。
由于我最早接触的是Database First这种模式,所以首先我们就来了解一下Database First模式的基本用法。
创建一个数据库
Database First顾名思意就是首先需要一个存在的数据库,所以这里需要创建一个数据库。
这里我们还是以Product为例。
Product表包含以下字段。
创建Console Application
我们为了方便简单点,这里我们创建一个Console Application程序。
在VS中选择创建一个Console Application程序。
创建ADO.NET Entity Data Model
这里我们选择ADO.NET Entity Data Model,命名为Product,后缀为.edmx文件。
点击Add按钮,弹出下面的向导框,选择Generate from database,也就是我们需要的Database First模式。
点击Next按钮,来到以下向导框中,选择我们之前创建的数据库,并为这个Entity Connection命名为ProductContext。
继续点击Next按钮,来到以下向导框中,选择我们需要添加的表,并输入一个Model Namespace。
点击Finish按钮,创建成功后我们可以看到自动安装了EntityFramwork的参考引用,还有我们创建的名为Product.edmx的文件。
双击打开Product.edmx文件,可以看到我们选择的Product表也加载映射到了文件当中。
基本的CRUD操作
下面我们开始在控制台程序里对Product表数据进行简单CRUD操作,打开Program.cs文件,在Main方法里编写CRUD代码,这里我们插入两条数据Product Name为Product A和Product B,修改Product Name为Product A的记录,删除Product Name为Product 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();
}
}
运行代码,效果如下图。
数据库表变化、视图、存储过程等基本操作
我们在项目开发阶段,有时候会遇到一些表后期需要加一些字段,那么我们来看看如果更新这些表的变化。
这里我们假如需要知道每个产品归属一个公司,那么我们需要新增一个公司Company表,并且在Product表新增一个CompanyID的字段,与Company表形成对应。
新增了一个Company表并且修改了Product表,接下来我们要更新我们的Entity Data Model。打开Product.edmx文件,右键单击选择Update Model from Database。
在弹出的向导框中,分别选择Add我们新建的Company表和Refresh我们修改的Product表。
点击Finish按钮。我们看到新建的Company表和修改的Product表都更新到了Model当中。
当我们在实际项目当中,有时候在做复杂的处理,比如需要更新多个表的内容,或者需要多个表联合查询的数据,我们可能更多的需要视图和存储过程来完成,那么这里我们看看如何加载视图和存储过程以及怎么调用它们。
首先我们简单的建立一个视图和一个存储过程。
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。在向导框中选择我们新建的视图和存储过程。
点击Finish按钮,我们可以看到新建的视图vProductAndCompany也更新到了Model中。
那么如何看到新增的存储过程到哪里了,我们依旧打开Product.edmx文件,右键单击选择Model Browser。
我们看到右侧的Model Browser中Function Imports下就是我们新增的存储过程,双击打开图中可以编辑它的名称以及返回值类型等。
接下来我们就可以来操作视图以及存储过程了。
首先,先准备一些测试数据,分别向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();
运行程序,结果如下。
另外,除了通过以上方式来对数据库数据操作之外,当然也可以直接用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 )的更多相关文章
- 如何正确地使用Entity Framework Database First
毕设依旧在不紧不慢地以每天解决一个问题的进度进行中.今天遇到的问题就是在建立数据模型时遇到的.因为项目是基于数据库构建的,所以理所应当地采用DB First来构造实体类和DbContext类.于是想也 ...
- mvc+entity framework database first,生成的model每次更新一个表会更新所有的model
在使用Entity Framework 的Database frist或model first时,直接加attribute到modle类上是太现实也不合理的,因为model类是自动生成的,重新生成后会 ...
- asp.net mvc5 step by step(三)—— Entity Framework Database First
一.先建数据库. 打开,SQL Server Management 新建数据库Employee 并新建表 /****** Object: Table [dbo].[t_Employee] Script ...
- Entity Framework 之Database first(数据库优先)&Model First(模型优先)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- C# ORM—Entity Framework 之Database first(数据库优先)&Model First(模型优先)(一)
一.什么是Entity Framework 1.1 实体框架(EF)是一个对象关系映射器,使.NET开发人员使用特定于域的对象与关系数据.它消除了需要开发人员通常需要编写的大部分数据访问代码.简化了原 ...
- ADO.NET Entity Framework CodeFirst 如何输出日志(EF 5.0)
ADO.NET Entity Framework CodeFirst 如何输出日志(EF4.3) 用的EFProviderWrappers ,这个组件好久没有更新了,对于SQL执行日志的解决方案的需求 ...
- Solve: Your project references the latest version of Entity Framework (for MySQL) in Visual Studio 2013
The error message while trying to create a ADO.net Entity Data Model ( Entity Framework 6 ) for MySq ...
- [转]Entity Framework and slow bulk INSERTs
本文转自:https://weblog.west-wind.com/posts/2013/Dec/22/Entity-Framework-and-slow-bulk-INSERTs I’ve been ...
- .NET Core开发日志——Entity Framework与PostgreSQL
Entity Framework在.NET Core中被命名为Entity Framework Core.虽然一般会用于对SQL Server数据库进行数据操作,但其实它还支持其它数据库,这里就以Po ...
随机推荐
- (三)Lua脚本语言入门
又要找工作了,变的忧虑了,唯有学习才让内心变得踏实,今天玩了一下午的王者荣耀,正事都忘了...... 如果认为所谓的毅力是每分每秒的"艰苦忍耐"式的奋斗,那这是一种很不足的心理状态 ...
- SQL Server-聚焦存储过程性能优化、数据压缩和页压缩提高IO性能(一)
前言 关于SQL Server基础系列尚未结束,还剩下最后一点内容未写,后面会继续.有园友询问我什么时候开始写SQL Server性能系列,估计还得等一段时间,最近工作也比较忙,但是会陆陆续续的更新S ...
- Spring中LocalSessionFactoryBean与SessionFactory
相信不少人多纠结LocalSessionFactoryBean与SessionFactory到底是什么关系,怎么去进行关联的,正如图所示: transactonManager有一个对sessionFa ...
- Apache常见功能实战详解
Apache 是一款使用量排名第一的 web 服务器,LAMP 中的 A 指的就是它.由于其开源.稳定.安全等特性而被广泛使用.前边的一篇文章中已经记录过如何搭建 LAMP 架构,搭建仅是第一步,其中 ...
- javase基础回顾(一)ArrayList深入解析 解读ArrayList源代码(JDK1.8.0_92)
我们在学习这一块内容时需要注意的一个问题是 集合中存放的依然是对象的引用而不是对象本身. List接口扩展了Collection并声明存储一系列元素的类集的特性.使用一个基于零的下标,元素可以通过它们 ...
- android列表停止滚动,加载图片,较为通用的一种办法
在Adapter的itemView里面,判断列表是否在滚动中,其实是比较麻烦的,可能耦合性会比较严重. 所以考虑了下,是否能在itemView里面,检测列表的滚动状态,并监听停止状态加载图片,实现it ...
- 初探Lambda表达式/Java多核编程【4】Lambda变量捕获
这周开学,上了两天感觉课好多,学校现在还停水,宿舍网络也还没通,简直爆炸,感觉能静下心看书的时间越来越少了...寒假还有些看过书之后的存货,现在写一点发出来.加上假期两个月左右都过去了书才看了1/7都 ...
- angular drag and drop (marceljuenemann) 笔记
这是原文 http://marceljuenemann.github.io/angular-drag-and-drop-lists/demo/#/simple 看起来很多功能,所以我只记入我需要的部分 ...
- Javascript中好用更改时间的方法
<script type="text/javascript"> //格式化时间格式的字符串 String.prototype.myTimes = function () ...
- 第35篇 IIS执行原理
服务器的监听(IIS6.0+版本) 当请求到达服务器时,请求最终会到达TCPIP.SYS驱动程序,TCPIP.SYS将请求转发给HTTP.SYS网络驱动程序的请求队列中(可以理解为专门处理http请求 ...