对于一个单独实体的通常操作有3种:添加新的实体、修改实体以及删除实体。

  1、添加新的实体

  Entity Framework Code First添加新的实体通过调用DbSet.Add()方法来实现。

using (var ctx = new PortalContext())
{
var province = new Province
{
ProvinceNo = "",
ProvinceName = "测试"
}; ctx.Provinces.Add(province);
ctx.SaveChanges();
}

  代码运行所执行的SQL语句:

exec sp_executesql N'insert [dbo].[Province]([ProvinceNo], [ProvinceName])
values (@0, @1)
select [ProvinceID]
from [dbo].[Province]
where @@ROWCOUNT > 0 and [ProvinceID] = scope_identity()',N'@0 nvarchar(10),@1 nvarchar(50)',@0=N'',@1=N'测试'

  2、修改实体

  修改数据库中已经存在的实体记录:

using (var ctx = new PortalContext())
{
var province = ctx.Provinces.Find();
province.ProvinceName = "Test";
ctx.SaveChanges();
}

  代码运行所执行的SQL语句:

exec sp_executesql N'SELECT
[Limit1].[ProvinceID] AS [ProvinceID],
[Limit1].[ProvinceNo] AS [ProvinceNo],
[Limit1].[ProvinceName] AS [ProvinceName]
FROM ( SELECT TOP (2)
[Extent1].[ProvinceID] AS [ProvinceID],
[Extent1].[ProvinceNo] AS [ProvinceNo],
[Extent1].[ProvinceName] AS [ProvinceName]
FROM [dbo].[Province] AS [Extent1]
WHERE [Extent1].[ProvinceID] = @p0
) AS [Limit1]',N'@p0 int',@p0=35
exec sp_executesql N'update [dbo].[Province]
set [ProvinceName] = @0
where ([ProvinceID] = @1)
',N'@0 nvarchar(50),@1 int',@0=N'Test',@1=35

  3、删除实体

  Entity Framework Code First添加新的实体通过调用DbSet.Remove()方法来实现。

  1>、根据已实例化的实体删除

  在根据已实例化的实体来删除实体时,通常需要先从数据库中读取该实体的数据,再调用DbSet.Remove()来删除,并通过DbContext到数据库中去删除该记录。

using (var ctx = new PortalContext())
{
var province = ctx.Provinces.Find();
ctx.Provinces.Remove(province);
ctx.SaveChanges();
}

  代码运行所执行的SQL语句:

exec sp_executesql N'SELECT
[Limit1].[ProvinceID] AS [ProvinceID],
[Limit1].[ProvinceNo] AS [ProvinceNo],
[Limit1].[ProvinceName] AS [ProvinceName]
FROM ( SELECT TOP (2)
[Extent1].[ProvinceID] AS [ProvinceID],
[Extent1].[ProvinceNo] AS [ProvinceNo],
[Extent1].[ProvinceName] AS [ProvinceName]
FROM [dbo].[Province] AS [Extent1]
WHERE [Extent1].[ProvinceID] = @p0
) AS [Limit1]',N'@p0 int',@p0=35
exec sp_executesql N'delete [dbo].[Province]
where ([ProvinceID] = @0)',N'@0 int',@0=35

  2>、根据主键删除实体

  根据主键来删除实体可以少执行一步从数据库中根据主键值读取记录的操作。

using (var ctx = new PortalContext())
{
var province = new Province { ProvinceID = };
ctx.Provinces.Attach(province);
ctx.Provinces.Remove(province);
ctx.SaveChanges();
}

  或

using (var ctx = new PortalContext())
{
var province = new Province { ProvinceID = };
ctx.Entry(province).State = EntityState.Deleted;
ctx.SaveChanges();
}

  注:EntityState需要引用命名空间using System.Data。

  代码运行所执行的SQL语句:

exec sp_executesql N'delete [dbo].[Province]
where ([ProvinceID] = @0)',N'@0 int',@0=36

  3>、执行SQL语句删除

using (var ctx = new PortalContext())
{
ctx.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Province] WHERE [ProvinceID]=37");
}

  4>、删除实体关联数据

  在需要删除一条记录时,若存在外键表。在需要在删除主表记录时,同时对外键表中关联的数据进行操作。

using (var ctx = new PortalContext())
{
var province = new Province { ProvinceID = };
ctx.Provinces.Attach(province); ctx.Entry(province)
.Collection(p => p.Cities)
.Load(); ctx.Provinces.Remove(province);
ctx.SaveChanges();
}

  代码运行所执行的SQL语句:

exec sp_executesql N'SELECT
[Extent1].[CityID] AS [CityID],
[Extent1].[ProvinceID] AS [ProvinceID],
[Extent1].[CityNo] AS [CityNo],
[Extent1].[CityName] AS [CityName]
FROM [dbo].[City] AS [Extent1]
WHERE [Extent1].[ProvinceID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=3
exec sp_executesql N'update [dbo].[City]
set [ProvinceID] = null
where ([CityID] = @0)
',N'@0 int',@0=2
exec sp_executesql N'update [dbo].[City]
set [ProvinceID] = null
where ([CityID] = @0)
',N'@0 int',@0=3

......

  从代码运行之后执行的SQL语句可以看出,在删除主表记录时,若引用的外键表设置外键运行为空时,将把关联记录的外键列的值设置为null。

  若外键引用为not null时,及City表中的外键字段ProvinceID为not null,则上面的代码运行之后执行的SQL语句为:

exec sp_executesql N'SELECT
[Extent1].[CityID] AS [CityID],
[Extent1].[ProvinceID] AS [ProvinceID],
[Extent1].[CityNo] AS [CityNo],
[Extent1].[CityName] AS [CityName]
FROM [dbo].[City] AS [Extent1]
WHERE [Extent1].[ProvinceID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=3
exec sp_executesql N'delete [dbo].[City]
where ([CityID] = @0)',N'@0 int',@0=2
exec sp_executesql N'delete [dbo].[City]
where ([CityID] = @0)',N'@0 int',@0=3

......

  在外键列允许为空时,删除主表记录,联带删除从表记录:

using (var ctx = new PortalContext())
{
var province = new Province { ProvinceID = };
ctx.Provinces.Attach(province); ctx.Entry(province)
.Collection(p => p.Cities)
.Load(); ctx.Provinces.Remove(province);
foreach (var city in province.Cities)
{
ctx.Cities.Remove(city);
} ctx.SaveChanges();
}

  代码运行之后执行的SQL语句:

exec sp_executesql N'SELECT
[Extent1].[CityID] AS [CityID],
[Extent1].[ProvinceID] AS [ProvinceID],
[Extent1].[CityNo] AS [CityNo],
[Extent1].[CityName] AS [CityName]
FROM [dbo].[City] AS [Extent1]
WHERE [Extent1].[ProvinceID] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=5
exec sp_executesql N'delete [dbo].[City]
where ([CityID] = @0)',N'@0 int',@0=20
exec sp_executesql N'delete [dbo].[City]
where ([CityID] = @0)',N'@0 int',@0=21

......

exec sp_executesql N'delete [dbo].[Province]
where ([ProvinceID] = @0)',N'@0 int',@0=5

Entity Framework Code First添加修改及删除单独实体的更多相关文章

  1. Entity Framework Code First添加修改及删除外键关联实体

    1.添加外键关联实体 1>.添加新的Province及City实体 using (var ctx = new PortalContext()) { var city1 = new City { ...

  2. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  3. Entity Framework Code First学习系列

    Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...

  4. Entity Framework Code First数据库连接

    1. 安装Entity Framework 使用NuGet安装Entity Framework程序包:工具->库程序包管理器->程序包管理器控制台,执行以下语句: PM> Insta ...

  5. Entity Framework Code First关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  6. Entity Framework Code First主外键关系映射约定

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

  7. Entity Framework Code First实现乐观并发

    Entity Framework Code First实现乐观并发 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: h ...

  8. Entity Framework Code first(转载)

    一.Entity Framework Code first(代码优先)使用过程 1.1Entity Framework 代码优先简介 不得不提Entity Framework Code First这个 ...

  9. Entity Framework Code First关系映射约定【l转发】

    本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...

随机推荐

  1. VirtualPathProvider的使用

    解决的问题,加载数据库中的UI public class Global : System.Web.HttpApplication { protected void Application_Start( ...

  2. ssh密钥私钥不能登陆问题处理

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! ...

  3. clang: error: linker command failed with exit code 1 (use -v to see invocati

    安装了 pod 的项目,如果仍旧打开 xcodeproject 文件, 运行时会弹出此 bug

  4. 使用神经网络来识别手写数字【译】(三)- 用Python代码实现

    实现我们分类数字的网络 好,让我们使用随机梯度下降和 MNIST训练数据来写一个程序来学习怎样识别手写数字. 我们用Python (2.7) 来实现.只有 74 行代码!我们需要的第一个东西是 MNI ...

  5. React-Native -课后练习

    import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, View, Image, } fro ...

  6. view的滑动冲突解决方案

    一.常见的滑动冲突场景 1.外部滑动方向和内部滑动方向不一致 2.外部滑动方向和内部滑动方向一致 3.上面两种情况的嵌套 二.滑动冲突处理的原则 场景1的处理原则是:当用户左右滑动时,需要让外部的vi ...

  7. HDU 2492 Ping pong (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Problem Description N(3<=N<=2000 ...

  8. 可变字符串NSMutableString

    //可变字符串继承自字符串 //拼接 NSMutableString *string = [NSMutableString string]; [string appendString:@"今 ...

  9. Mac下搭建hexo

    Mac下搭建hexo 并部署到gitcafe 1.安装brewhome ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homeb ...

  10. Unity3D UGUI之DoTweenAnimation脚本控制动画方法

    DOTweenAnimation脚本: Loops循环:-1时即永久循环播放. Loops Type 是选择播放模式. Ease属性里有很多,暂时只知道Linear的效果,其他有待单独写. ID下面可 ...