什么是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 = 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();
            }
        }

运行代码,效果如下图。

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(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

接下来我们同样打开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',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)

接着,我们代码实现调用存储新增一条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 = 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();

运行程序,结果如下。
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 )

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

 

 

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

 

相关文章:

  • 2021-10-14
  • 2022-02-08
  • 2022-02-06
  • 2021-07-02
  • 2021-12-07
  • 2022-12-23
猜你喜欢
  • 2021-09-28
  • 2021-12-10
  • 2022-12-23
  • 2021-12-18
  • 2022-03-03
  • 2021-05-23
相关资源
相似解决方案