LINQ to Entity

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/stu_20052369/article/details/88179861

LINQ to SQL和 Entity Framework 的区别

LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射(ORM)技术。他们之间的本质区别在于Entity Framework对数据库架构和查询的类型实行了更好的解耦。使用Entity Framework,查询的对象不再是完全对应数据库架构的C#类,而是更高层的抽象:Entity Data Model。这提供了额外的灵活性,但是在性能和简单性上面也会有所损失。具体二者之间的区别如下:

1.LINQ to SQL所支持的特性比较少,EntityFramework支持的特性比较多.

2.LINQ to SQL在数据表与类之间提供了一对一的映射。如果有Customers,Orders, 和Lineitems表,就会有Customer,Order, 和Lineitem类来匹配每一个表。EntityFramework可以使你有一个Customer类,而这个类可以匹配多个表。这就意味着公司名可以 在一个表中,但是地址是在另一个表中,而电话号码又在另一个表中.

3.LINQ to SQL只支持Microsoft SQL Server 2000及之后的版本。EntityFramework可以支持IBMDB2, Sybase SqlAnywhere, Oracle, SQLAzure等。

4.微软在发布了Entity Framework之后就停止了发布新的LINQ to SQL,但由于LINQto SQL的简单性,它还是很受欢迎的,所以微软仍将继续对LINQto SQL的用户进行支持与反馈,但是LINQto SQL将不再发布新版本进行完善。

生成数据模型

本demo 以vs2017的console application为例。

1. 新建空的项目

2. 右键添加ADO.NET Entity Data Model

 选择从一个已经存在的数据库生成模型,配置数据库连接,选择表、视图、和存储过程。还可以选择使用复数还是单数形式的对象名(例如,Products 表的行被命名为 Product )、是否包含外键关系等。

3. 查

 using (var context = new EntityModelTest())
            {
                Console.WriteLine("Read:");
                var tableTests = context.TableTests;

                foreach (var b in tableTests)
                {
                    Console.WriteLine($"{b.ID} {b.Name}");
                }

                Console.WriteLine("Query:");

                var tableTests2 = context.TableTests.Where(item => item.ID > 3).Select(item => item);

                foreach (var b in tableTests2)
                {
                    Console.WriteLine($"{b.ID} {b.Name}");
                }
            }

4. 改

  using (var context = new EntityModelTest())
            {
                int records = 0;
                TableTest tableTest = context.TableTests.Where(item => item.ID > 3).Select(item => item).FirstOrDefault();
                if (tableTest != null)
                {
                    tableTest.Name = "Jamie_10";
                    records = await context.SaveChangesAsync(); 
                }
                Console.WriteLine($"{records} record updated");
               
            }

5. 删

using (var context = new EntityModelTest())
            {
                 var books = context.TableTests.Where(item => item.ID > 3).Select(item => item);
                
                context.TableTests.RemoveRange(books);
                int records = await context.SaveChangesAsync();
                Console.WriteLine($"{records} records deleted");
            }

 6. 增

 using (var context = new EntityModelTest())
            {
                var personOne = new TableTest { ID=11, Name="Jamie11"};
                context.TableTests.Add(personOne);

                var persons = new List<TableTest> {
                    new TableTest { ID=12, Name="Jamie12"},
                    new TableTest { ID=13, Name="Jamie13"}
                };
                context.TableTests.AddRange(persons);
                int records = await context.SaveChangesAsync();
                Console.WriteLine($"{records} records added");
            }

async ,await,task

async 通常作为方法修饰符,表示运行此方法时,如果有需要远程调用的资源,需要等待时,会让出CPU资源,继续运行。

await 通常用在调用远程资源的语句前,表示此方法中,await后面的语句需要等待远程资源的反馈信息后再执行。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace linqToEntityTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            // async 方法
            p.UpdateTableTest();
            p.ReadTableTest();

            Console.ReadLine();
        }

        private void ReadTableTest()
        {
            Console.WriteLine(nameof(ReadTableTest));

            using (var context = new EntityModelTest())
            {
                Console.WriteLine("Read:");
                var tableTests = context.TableTests;

                foreach (var b in tableTests)
                {
                    Console.WriteLine($"{b.ID} {b.Name}");
                }

                Console.WriteLine("Query:");

                var tableTests2 = context.TableTests.Where(item => item.ID > 3).Select(item => item);

                foreach (var b in tableTests2)
                {
                    Console.WriteLine($"{b.ID} {b.Name}");
                }
            }
                Console.WriteLine();
        }

        private async void UpdateTableTest()
        {
            Console.WriteLine(nameof(UpdateTableTest));

            using (var context = new EntityModelTest())
            {
                int records = 0;
                TableTest tableTest = context.TableTests.Where(item => item.ID > 3).Select(item => item).FirstOrDefault();
                if (tableTest != null)
                {
                    //tableTest.ID = 10;

                    tableTest.Name = "Jamie_10";
                    
                    records = await context.SaveChangesAsync(); //让出CPU 资源,执行p.ReadTableTest();

                }
                // 等待获得远程资源反馈后,再执行。
                Console.WriteLine($"{records} record updated");
               

               
            }


            Console.WriteLine();
        }
    }
}

到目前为止,可能会在update没完成的时候,读取到脏数据。因此要求update的时候不能进行其他操作。

代码可以将做简单的修改:

//方法添加task 修饰符
private async Task UpdateTableTest(){}

//方法调用
  
 Program p = new Program();
 p.UpdateTableTest().Wait();
 p.ReadTableTest();

      

猜你喜欢

转载自blog.csdn.net/stu_20052369/article/details/88179861