使用Entity Framework 自动产生的Sql语句
对于一个单独实体的通常操作有3种:添加新的实体、修改实体以及删除实体。
1、添加新的实体
Entity Framework Code First添加新的实体通过调用DbSet.Add()方法来实现。

using (var ctx = new PortalContext())
{
var province = new Province
{
ProvinceNo = "100000",
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'100000',@1=N'测试'
2、修改实体
修改数据库中已经存在的实体记录:
using (var ctx = new PortalContext())
{
var province = ctx.Provinces.Find(35);
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(35);
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 = 36 };
ctx.Provinces.Attach(province);
ctx.Provinces.Remove(province);
ctx.SaveChanges();
}

或
using (var ctx = new PortalContext())
{
var province = new Province { ProvinceID = 36 };
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 = 3 };
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 = 5 };
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
来源:http://www.cnblogs.com/libingql/p/3388491.html
使用Entity Framework 自动产生的Sql语句的更多相关文章
- Entity Framework Code First执行SQL语句、视图及存储过程
1.Entity Framework Code First查询视图 Entity Framework Code First目前还没有特别针对View操作的方法,但对于可更新的视图,可以采用与Table ...
- Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题
在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public ...
- 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明
一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...
- [转]Entity Framework vs. LINQ to SQL
Entity Framework和LINQ to SQL到底有什么区别?这是一个很常见的问题.下面的表中简要罗列了两种技术的主要区别. LINQ to SQL Entity Framework 复杂度 ...
- Entity Framework 与 LINQ to SQL
Entity Framework和LINQ to SQL到底有什么区别?这是一个很常见的问题.下面的表中简要罗列了两种技术的主要区别. LINQ to SQL Entity Framework 复杂度 ...
- Entity Framework Code First for SQL Compact
这篇博客将介绍EF Code First中如何使用SQL Compact.SQL Compact是微软推出的免费的关系型数据库,目前最新版本是SQL Compact 4.0.微软的开发工具VS 201 ...
- PostgreSQL Entity Framework 自动迁移
1.依次添加NuGet包 EntityFramework.Npgsql.EntityFramework6.Npgsql,会自动生成一些配置文件,不过缺少数据库驱动的配置节点: <system.d ...
- 如何得到EF(ADO.NET Entity Framework)查询生成的SQL? ToTraceString Database.Log
ADO.NET Entity Framework ToTraceString //输出单条查询 DbContext.Database.Log //这里有详细的日志
- Entity Framework 自动生成CodeFirst代码
前言 在前面的文章中我们提到Entity Framework的“Code First”模式也同样可以基于现有数据库进行开发.今天就让我们一起看一下使用Entity Framework Power To ...
随机推荐
- 疯狂java学习笔记之面向对象(二) - 成员变量与局部变量
Java变量按其作用域可分为:成员变量和局部变量.注意:在Java中是没有全局变量这个概念的 一.成员变量: 成员变量是在类中定义的变量,具体可分为类变量与实例变量--有无static修饰 实例变量的 ...
- Hadoop YARN资源隔离技术
YARN对内存资源和CPU资源采用了不同的资源隔离方案.对于内存资源,它是一种限制性资源,它的量的大小直接决定应用程序的死活,因为应用程序到达内存限制,会发生OOM,就会被杀死.CPU资源一般用Cgr ...
- Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
A. As Easy As Possible 每个点往右贪心找最近的点,可以得到一棵树,然后倍增查询即可. 时间复杂度$O((n+m)\log n)$. #include <bits/stdc+ ...
- XIII Open Cup named after E.V. Pankratiev. GP of SPb
A. Graph Coloring 答案为$1$很好判,为$2$只需要二分图染色,对于$3$,首先爆搜哪些边要染成第$3$种颜色,然后二分图染色判定即可. B. Decimal Fraction 枚举 ...
- checkbox属性checked="checked"通过js已设置,但是不勾选
1.通过 attr('checked','checked') 来设置checkbox时,重复点击,虽然checked属性设置正确,但是checkbox没有被勾选 ,如下代码:(代码是全选功能) $(' ...
- JS学习(二)
1 数组对象 作用是:使用单独的变量名来存储一系列的值. 1.1 新建数组: var mycars = new Array() mycars[0] = "Saab" mycars[ ...
- html5调用手机相机并压缩、上传
近日刚做的一个功能,要在app里使用内嵌页面进行图像的上传.从功能上看,原生的实现应该是最好的.毕竟页面上所有的东西都隔着一个浏览器,所有的实现都要依赖浏览器提供的接口,不同的浏览器对接口的实现又有差 ...
- 20161004 NOIP 模拟赛 T1 解题报告
第1题 小麦亩产一千八 [问题描述] “有了金坷垃,肥料一袋能顶两袋撒,小麦亩产一千八,吸收两米下的氮磷钾……”,话说HYSBZ(Hengyang School for Boys & Zy) ...
- 【BZOJ1067】【POJ2637】降雨量
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3004 Solved: 767[Submit][Status] ...
- bug:clang: error: no input files
1.clang: error: no input files这个问题一般是因为你删除或者移动了某一个文件,但是在你的编译资源里面( project > target > Build Pha ...