1. 基本保存

  每个DBContext实例都有一个ChangeTracker,负责跟踪需要写入数据库的更改。当实例发生更改时,更改会被记录在ChangeTracker中,在调用 SaveChanges 时被写入数据库。

1.1 添加数据

  使用 DbSet.Add()添加实体类的新实例。 调用 SaveChanges() 时,数据将插入到数据库中。

using (var context = new LibingContext())
{
var role = new Role
{
RoleName = "教师"
};
context.Roles.Add(role); context.SaveChanges();
}

1.2 更新数据

  Entity Framwork Core将自动检测对由DbContext跟踪的实体所做的更改。

  更新数据:修改属性值,调用 SaveChanges()。

using (var context = new LibingContext())
{
var role = context.Roles.Find();
role.RoleName = "教师"; context.SaveChanges();
}

1.3 删除数据

  使用 DbSet.Remove() 删除实体类的实例。

  如果实体已存在于数据库中,则 SaveChanges() 将删除该实体。 如果实体尚未保存到数据库(即跟踪为“已添加”),则 SaveChanges() 时,该实体会从上下文中删除且不再插入。

using (var context = new LibingContext())
{
var role = context.Roles.Find();
context.Roles.Remove(role); context.SaveChanges();
}

1.4 一个SaveChanges 中的多个操作

  可以将多个添加/更新/删除操作合并到对“SaveChanges”的单个调用。

  对于大多数数据库提供程序,“SaveChanges”是事务性的。

using (var context = new LibingContext())
{
// 新增
context.Roles.Add(new Role { RoleName = "管理员" });
context.Roles.Add(new Role { RoleName = "学生" }); // 修改
var modifyRole = context.Roles.Find();
modifyRole.RoleName = "教师"; // 删除
var deleteRole = context.Roles.Where(t => t.RoleID == ).FirstOrDefault();
context.Roles.Remove(deleteRole); context.SaveChanges();
}

2. 关联数据

2.1 添加新实体的关系图

using (var context = new LibingContext())
{
var category = new Category
{
CategoryName = "手机",
Products = new List<Product> {
new Product { ProductName = "华为", UnitPrice = },
new Product { ProductName = "小米", UnitPrice = }
}
};
context.Categories.Add(category); context.SaveChanges();
}
exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [Category] ([CategoryName])
VALUES (@p0);
SELECT [CategoryID]
FROM [Category]
WHERE @@ROWCOUNT = 1 AND [CategoryID] = scope_identity(); ',N'@p0 nvarchar(4000)',@p0=N'手机'
exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [Product] ([CategoryID], [ProductName], [UnitPrice])
VALUES (@p0, @p1, @p2);
SELECT [ProductID]
FROM [Product]
WHERE @@ROWCOUNT = 1 AND [ProductID] = scope_identity(); ',N'@p0 int,@p1 nvarchar(4000),@p2 decimal(4,0)',@p0=1,@p1=N'华为',@p2=2000
exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [Product] ([CategoryID], [ProductName], [UnitPrice])
VALUES (@p0, @p1, @p2);
SELECT [ProductID]
FROM [Product]
WHERE @@ROWCOUNT = 1 AND [ProductID] = scope_identity(); ',N'@p0 int,@p1 nvarchar(4000),@p2 decimal(4,0)',@p0=1,@p1=N'小米',@p2=1000

2.2 添加关联实体

  如果从已由DbContext跟踪的实体的导航属性中引用新实体,则该实体将插入到数据库中。

using Microsoft.EntityFrameworkCore;
using (var context = new LibingContext())
{
var category = context.Categories
.Include(t => t.Products)
.Where(t => t.CategoryID == )
.FirstOrDefault();
category.Products.Add(new Product
{
ProductName = "VIVO",
UnitPrice =
}); context.SaveChanges();
}
SELECT TOP(1) [t].[CategoryID], [t].[CategoryName]
FROM [Category] AS [t]
WHERE [t].[CategoryID] = 1
ORDER BY [t].[CategoryID]
SELECT [t.Products].[ProductID], [t.Products].[CategoryID], [t.Products].[ProductName], [t.Products].[UnitPrice]
FROM [Product] AS [t.Products]
INNER JOIN (
SELECT TOP(1) [t0].[CategoryID]
FROM [Category] AS [t0]
WHERE [t0].[CategoryID] = 1
ORDER BY [t0].[CategoryID]
) AS [t1] ON [t.Products].[CategoryID] = [t1].[CategoryID]
ORDER BY [t1].[CategoryID]
exec sp_executesql N'SET NOCOUNT ON;
INSERT INTO [Product] ([CategoryID], [ProductName], [UnitPrice])
VALUES (@p0, @p1, @p2);
SELECT [ProductID]
FROM [Product]
WHERE @@ROWCOUNT = 1 AND [ProductID] = scope_identity(); ',N'@p0 int,@p1 nvarchar(4000),@p2 decimal(4,0)',@p0=1,@p1=N'VIVO',@p2=1500

2.3 更改关系

  如果更改实体的导航属性,则将对数据库中的外键列进行相应的更改。

using (var context = new LibingContext())
{
var category = context.Categories.Find();
var product = context.Products.Find();
product.Category = category; context.SaveChanges();
}
exec sp_executesql N'SELECT TOP(1) [e].[CategoryID], [e].[CategoryName]
FROM [Category] AS [e]
WHERE [e].[CategoryID] = @__get_Item_0',N'@__get_Item_0 int',@__get_Item_0=2
exec sp_executesql N'SELECT TOP(1) [e].[ProductID], [e].[CategoryID], [e].[ProductName], [e].[UnitPrice]
FROM [Product] AS [e]
WHERE [e].[ProductID] = @__get_Item_0',N'@__get_Item_0 int',@__get_Item_0=1
exec sp_executesql N'SET NOCOUNT ON;
UPDATE [Product] SET [CategoryID] = @p0
WHERE [ProductID] = @p1;
SELECT @@ROWCOUNT; ',N'@p1 int,@p0 int',@p1=1,@p0=2

2.4 删除关系

  可以通过将引用导航设置为 null 或从集合导航中删除相关实体来删除关系。

  默认情况下,对于必选关系,将配置级联删除行为,并将从数据库中删除子实体/依赖实体。 对于可选关系,默认情况下不会配置级联删除,但会将外键属性设置为 null。

using (var context = new LibingContext())
{
var category = context.Categories
.Include(t => t.Products)
.Where(t => t.CategoryID == )
.FirstOrDefault(); //category.Products.Remove(category.Products.FirstOrDefault());
category.Products = null; context.SaveChanges();
}
SELECT TOP(1) [t].[CategoryID], [t].[CategoryName]
FROM [Category] AS [t]
WHERE [t].[CategoryID] = 1
ORDER BY [t].[CategoryID]
SELECT [t.Products].[ProductID], [t.Products].[CategoryID], [t.Products].[ProductName], [t.Products].[UnitPrice]
FROM [Product] AS [t.Products]
INNER JOIN (
SELECT TOP(1) [t0].[CategoryID]
FROM [Category] AS [t0]
WHERE [t0].[CategoryID] = 1
ORDER BY [t0].[CategoryID]
) AS [t1] ON [t.Products].[CategoryID] = [t1].[CategoryID]
ORDER BY [t1].[CategoryID]
exec sp_executesql N'SET NOCOUNT ON;
DELETE FROM [Product]
WHERE [ProductID] = @p0;
SELECT @@ROWCOUNT; ',N'@p0 int',@p0=2
exec sp_executesql N'SET NOCOUNT ON;
DELETE FROM [Product]
WHERE [ProductID] = @p0;
SELECT @@ROWCOUNT; ',N'@p0 int',@p0=3

3. 级联删除

EntityFramework Core笔记:保存数据(4)的更多相关文章

  1. EntityFramework Core笔记:查询数据(3)

    1. 基本查询 1.1 加载全部数据 using System.Linq; using (var context = new LibingContext()) { var roles = contex ...

  2. EntityFramework Core笔记:表结构及数据基本操作(2)

    1. 表结构操作 1.1 表名 Data Annotations: using System.ComponentModel.DataAnnotations.Schema; [Table("R ...

  3. EntityFramework Core笔记:入门(1)

    1. 安装运行环境 EntityFramework Core运行环境,安装NuGget包: //Sql Server Database Provider PM> Install-Package ...

  4. Android学习笔记——保存数据到SQL数据库中(Saving Data in SQL Databases)

    知识点: 1.使用SQL Helper创建数据库 2.数据的增删查改(PRDU:Put.Read.Delete.Update) 背景知识: 上篇文章学习了保存文件,今天学习的是保存数据到SQL数据库中 ...

  5. Android学习笔记-保存数据的实现方法2-SharedPreferences

    Android下,数据的保存,前面介绍过了,把数据保存到内存以及SD卡上,这次我们就介绍一下,更为常用的采用SharedPreferences的方式来保存数据, 1,得到SharedPreferenc ...

  6. Android学习笔记-保存数据的实现方法1

    Android开发中,有时候我们需要对信息进行保存,那么今天就来介绍一下,保存文件到内存,以及SD卡的一些操作,及方法,供参考. 第一种,保存数据到内存中: //java开发中的保存数据的方式 pub ...

  7. 02-EF Core笔记之保存数据

    EF Core通过ChangeTracker跟踪需要写入数据库的更改,当需要保存数据时,调用DbContext的SaveChanges方法完成保存. 基本的添加.更新.删除操作示例如下: using ...

  8. IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据

    IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据 原文:http://docs.identityserver.io/en/r ...

  9. Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor

    Webservice WCF WebApi   注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...

随机推荐

  1. springboot~Compiler时开启插件的注解功能

    对于IJ这个IDE工具来说,我们会安装一些插件来帮助我们更好的进行开发,像lombok就是一款不错的插件,使用注解的方式在项目编译时帮助我们生成代码,像getter,setter,tostring等等 ...

  2. Jvm垃圾回收器(终结篇)

    知识回顾: 第一篇<Jvm垃圾回收器(基础篇)>主要讲述了判断对象的生死?两种基础判断对象生死的算法.引用计数法.可达性分析算法,方法区的回收.在第二篇<Jvm垃圾回收器(算法篇)& ...

  3. [翻译]Linux 内核里的数据结构 —— 基数树

    目录 Linux 内核里的数据结构 -- 基数树 基数树 Radix tree Linux内核基数树API 链接 Linux 内核里的数据结构 -- 基数树 基数树 Radix tree 正如你所知道 ...

  4. DSAPI TreeView节点增删简化操作

    将一行或多行字符串添加到TreeView控件. 函数: 控件.TreeView控件.添加路径节点到TreeView(要添加节点的TreeView控件,字符串或字符串数组) 示例:将一个多行文本添加到T ...

  5. [转]How to: Create a Report Server Database (Reporting Services Configuration)

    本文转自:https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms157300%28v%3dsql.10 ...

  6. java 学习必备的软件,持续更新中

    小编会持续更新在学习Java过程中需要的软件以及各种文件: 话不多说,看行动! 一:JDK (1)JDK1.8(*64): 链接:https://pan.baidu.com/s/1vM0jNXn2CT ...

  7. Vue 无限滚动加载指令

    也不存在什么加载咯, 就是一个判断滚动条是否到达浏览器底部了. 如果到了就触发事件,米到就不处理. 计算公式提简单的   底部等于(0) =  滚动条高度 - 滚动条顶部距离 - 可视高度.  反正结 ...

  8. 小程序开发基础-view视图容器

    view 视图容器. // wxml <view class="section"> <view class="section__title"& ...

  9. JavaScript 节流函数 Throttle 详解

    在浏览器 DOM 事件里面,有一些事件会随着用户的操作不间断触发.比如:重新调整浏览器窗口大小(resize),浏览器页面滚动(scroll),鼠标移动(mousemove).也就是说用户在触发这些浏 ...

  10. sparkSQL catalyst

    最近想来,大数据相关技术与传统型数据库技术很多都是相互融合.互相借鉴的.传统型数据库强势在于其久经考验的SQL优化器经验,弱势在于分布式领域的高可用性.容错性.扩展性等,假以时日,让其经过一定的改造, ...