Entity Framework 学习笔记 1 Books

谁说我不能喝 提交于 2020-02-16 10:02:54

Entity Framework 简介

        Entity FrameWork 1 Entity FrameWork的第一个版本没有准备用于.NET3.5. 一个产品是LINQ to SQL, 它提供了类似的功能,可以用于.net3.5. 从广义上看,LINQ to SQL 和Entity FrameWork 提供了类似的功能。然而,LINQ to SQL使用更简单,但只用于访问SQL Server。 Entity FrameWork 是基于提供程序的,可以访问几种不同的关系数据库。它包含了更多的功能,比如多对多映射,不需要映射对象,可以进行n到n映射。Entity FrameWork 的一个缺点是,他要求模型类型派生自EnitiyObject基类。使用一个包含xml的edmx文件,把对象映射到关系上。

        Entity FrameWork 4 可用于.net4 进行了中大改进,许多想法都来自linqtosql。因为改动较大,跳过了版本2和3 。这个版本中增加了延迟加载,在访问属性的时候获取关系。设计模型后,可以使用sql数据定义语言创建数据库。使用Entity FrameWork 的两个模型闲杂是 databasefirst 或 ModelFirst。添加的重要特性是支持Plain Old所有阻碍派生自基类EntityObject。

         Entity FrameWork 5 的NuGet包支持 .net4.5和.net 4 然而, Entity FrameWork 5的许多功能可以用于net 4.5  Entity FrameWork 任然基于安装在系统上的类型和.net4.5.  在这个版本中吗,新增了性能改进,支持新的SqlServer功能,如控件数据类型。

        Entity FrameWork 6 解决了 Entity FrameWork 5 的一些功能,其部分原因是,该框架的一部分安装在系统上,一部分通过Nuget扩展获得。 现在  Entity FrameWork 的完整代码都移到NuGet包上。为了不出现冲突使用一个新的命名空间。将应用程序移植到新版本上,必须改变名称空间

        本章节介绍  Entity FrameWork 的最新版本  Entity FrameWork Core 1.0 这个版本完全重写了,删除旧的行为。这个版本不支持xml文件映射与 CSDL, SSDL,和MSL。只支持Code First 用 Entity FrameWork 4。1 添加的模型。

        Entity FrameWork Core 1.0 暂时不支持Entity FrameWork 6的所有功能,但随着时间推移新版本的Entity FrameWork Core  会提供更多特性。只需要注意使用什么版本的Entity FrameWork Core 。在非Windows平台上使用asp。nent core1.0 使用Entity FrameWork 与通用windows平台,使用费关系数据存储都需要使用Entity FrameWork Core 1.0。

 

Entity Framework 第一个例子

        第一个例子使用一个Book类型,把这种类型映射到SQL Server 数据库中的books表。把记录写到数据库然后读取,更新和删除他们。

        在第一个例子中,首先创建数据库,在此 使用 SQL SERVER 2008 R2,示例数据库只有一个表 Books。

        为了创建Books表,可以新建一个books数据库 在数据库内使用T-SQL代码创建数据库

CREATE TABLE [ado].[Books]
{
    [BookID] INT NOT NULL PRIMARY KEY IDENTITY,
    [Title] NVARCHAR(50) NOT NULL,
    [Publisher] NVARCHAR(25) NOT NULL
}

创建模型

        访问Books数据库的BookSample示例应用程序是一个控制台程序(包)。这个示例使用以下依赖项和命名空间

从NuGet中安装

Book类是一个简单的实体类型,定义了三个属性。BookID 属性映射到表的主键,Title属性映射到Title列,Publisher属性映射到Publisher列。 为了把类型映射到Books表,Table特性应用于类型

using System;
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;
using static System.Console;

namespace booksCore
{
    [Table("Books")]
    public class Book
    {
        public int BookId { get; set; }
        public string Title { get; set; }
        public string Publisher { get; set; }
    }
}

 

创建上下文

        通过创建BooksContext 类,就实现了Book表比数据库的关系。这个类派生自基类DbContext. BooksContext 类定义了Dbset<Book>类型的Books属性。这个类型运行创建查询,添加Book实例,存储在数据库中。要定义连接字符串,可以重写DbContext的OnConfiguring方法。在这里,UseSqlServer扩展方法将上下文映射到Sql server 数据库

 

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.EntityFrameworkCore;

namespace booksCore
{
    public class BooksContext : DbContext
    {
        private const string ConnectionString = "";
        public DbSet<Book> Books { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            optionsBuilder.UseSqlServer(ConnectionString);

        }
    }
}

 

 写入数据库

        创建带有Books表的数据库;定义模型和上下文类,现在就可以用数据填充表了。创建AddBookAsync方法,把Book对象添加到数据库中。首先,实例化BooksContext对象。使用using语句确保数据库连接是关闭的。使用Add方法将对象添加到上下文后,调用SaveChangesAsyns把实体写入数据库

        private async Task AddBookAsync(string title, string publisher)
        {
            using (var context = new BooksContext())
            {
                var book = new Book { Title = title, Publisher = publisher };
                context.Add(book);
                int records = await context.SaveChangesAsync();

                WriteLine($"{records} record added");
            }
            WriteLine();
        }

 

为了添加一组图书,可以使用AddRange方法 

        private async Task AddBooksAsync()
        {
            using (var context = new BooksContext())
            {
                var b1 = new Book { Title = "Professional C# 5 and .NET 4.5.1", Publisher = "Wrox Press" };
                var b2 = new Book { Title = "Professional C# 2012 and .NET 4.5", Publisher = "Wrox Press" };
                var b3 = new Book { Title = "JavaScript for Kids", Publisher = "Wrox Press" };
                var b4 = new Book { Title = "Web Design with HTML and CSS", Publisher = "For Dummies" };
                var b5 = new Book { Title = "Conflict Handling", Publisher = "Test" };
                context.AddRange(b1, b2, b3, b4, b5);
                int records = await context.SaveChangesAsync();

                WriteLine($"{records} records added");
            }
            WriteLine();
        }

读取数据库

        为了在C#代码中读取数据,只需要调用BooksContext,访问Books属性。访问该属性会创建一个SQL语句,从数据库中检索所有的书

        private void ReadBooks()
        {
            using (var context = new BooksContext())
            {
                var books = context.Books;
                foreach (var b in books)
                {
                    WriteLine($"{b.Title} {b.Publisher}");
                }
            }
            WriteLine();
        }

Entity Framework 提供了一个LINQ提供程序。使用它可以创建LINQ查询来访问数据库。也可以使用方法如下所示:

        private void QueryBooks()
        {
            using (var context = new BooksContext())
            {
                var wroxBooks = context.Books.Where(b => b.Publisher == "Wrox Press");

                // comment the previous line and uncomment the next lines to try the LINQ query syntax
                //var wroxBooks = from b in context.Books
                //                where b.Publisher == "Wrox Press"
                //                select b;
                foreach (var b in wroxBooks)
                {
                    WriteLine($"{b.Title} {b.Publisher}");
                }
            }
            WriteLine();
        }

更新记录

        更新记录很容易实现:修改上下文加载的对象,并调用saveChangesAsync

        private async Task UpdateBookAsync()
        {
            using (var context = new BooksContext())
            {
                int records = 0;
                var book = context.Books.Where(b => b.Title == "Professional C# 6").FirstOrDefault();
                if (book != null)
                {
                    book.Title = "Professional C# 6 and .NET Core 5";
                    records = await context.SaveChangesAsync();
                }

                WriteLine($"{records} record updated");
            }
            WriteLine();
        }

删除记录

        最后,清理数据库,删所有记录。为此,可以检索所有记录,并调用Remove或Removerang方法,把上下文中对象的状态设置为删除。现在调用DeleteBooksAsync方法,从数据库中删除记录,并为每一个对象调用sql delete 语句

        private async Task DeleteBooksAsync()
        {
            using (var context = new BooksContext())
            {
                var books = context.Books;
                context.Books.RemoveRange(books);
                int records = await context.SaveChangesAsync();
                WriteLine($"{records} records deleted");
            }
            WriteLine();
        }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!