什么是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为例。

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

Product表包含以下字段。

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

 

创建Console Application

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

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

 

创建ADO.NET Entity Data Model

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

 移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

基本的CRUD操作

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

代码如下:

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

        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 = 10000,
                        Count = 10,
                        Description = "Description A"
                    },                    new Product
                    {
                        ProductName = "Product B",
                        Price = 20000,
                        Count = 20,
                        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();
            }
        }

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

运行代码,效果如下图。

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

 

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

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

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

CREATE  PROCEDURE [dbo].[spSaveOrUpdateProduct](
   @ProductID int,
   @ProductName nvarchar(50),
   @Price decimal(18,2),
   @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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

接下来我们同样打开Product.edmx文件,右键单击选择Update Model from Database。在向导框中选择我们新建的视图和存储过程。
移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

 移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

 -- 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',100000,10,'Description A',1)
  insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product B',200000,20,'Description B',2)
  insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product C',300000,30,'Description C',3)
  insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product D',100000,10,'Description D',1)
  insert into Product(ProductName,Price,[Count],[Description],CompanyID) values('Product E',200000,20,'Description E',2)

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

                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 = 0,
                    ProductName = "Product F",
                    Price = 30000,
                    Count = 5,
                    Description = "Description F",
                    CompanyID = 1
                };                var result = productContext.spSaveOrUpdateProduct(newProduct.ProductID, newProduct.ProductName, newProduct.Price, newProduct.Count, newProduct.Description, newProduct.CompanyID);                foreach (int returnValue in result)
                {                    if (returnValue > 0)
                    {
                        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();

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

运行程序,结果如下。
移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

 

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

移动开发培训,Android培训,安卓培训,手机开发培训,手机维修培训,手机软件培训

                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 Pr
                http://www.cnblogs.com/mejoy/p/6475780.html

延伸阅读

告别“老顽固”-Java培训,做最负责任的教育,学习改变命运,软件学习,再就业,大学生如何就业,帮大学生找到好工作,lphotoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训告别“老顽固”