Entity Framework(四)--EF原理和状态管理
一、原理:
如何查看真正执行的SQL是怎样的?
DbContext有一个Database属性,Database属性有一个Log属性,是Action委托类型其中的参数就是sql语句,每次EF执行sql语句的时候都会执行Log,因此就知道执行了什么sql;
EF的查询是“延迟执行”的,只有遍历结果集的时候才执行select查询,Tolist()内部也是遍历结果集形成的List;
static void Main(string[] args) { using (TestDbContext ctx = new TestDbContext()) { ctx.Database.Log = sql => { Console.WriteLine(sql); }; var ps= ctx.Persons.Where(p => p.Id <4); Console.WriteLine("开始执行了"); foreach (var p in ps) { Console.WriteLine(p.ToString()); } Console.ReadKey(); } }
long[] ids = { 2, 5, 8 }; var result = ctx.Persons.Where(p => ids.Contains(p.Id));
result.toList();
//二次过滤,在sql中自动拼接。 long[] ids = { 2, 5, 8 }; var result = ctx.Persons.Where(p => ids.Contains(p.Id)); result = result.Where(p => p.Name.Length > 5);
EF多次指定where来实现动态的复合检索; select返回值必须写成IQueryable<Person>
EF是夸数据库的,如果迁移到Mysql数据库上,就会编译成Mysql语法。要配置对应数据库的EntityFrameworkProvider
每次执行_MigrationHistory 是DBMigration用的,也就是EF帮我们建数据库,可以禁用:
Database.SetInitializer<****DbContext>(null)
二、执行原始Sql语句:
在一些特殊的场合,需要执行原生的SQL。
执行非查询语句:调用DbContext 的Database 属性的ExecutesqlCommand 方法,可以通过占位符的方式传递参数:
using (TestDbContext ctx = new TestDbContext()) { string name = "Tony"; ctx.Database.ExecuteSqlCommand("insert into T_Persons(Name,CreateDateTime) values({0},GetDate())", name); Console.ReadKey(); }
执行查询语句:
static void Main(string[] args) { using (TestDbContext ctx = new TestDbContext()) { var result= ctx.Database.SqlQuery<GroupCount>(" select Age,COUNT(*) as GroupCounts from T_Persons group by Age "); foreach (var item in result) { Console.WriteLine(item.Age+"="+item.GroupCounts); } Console.ReadKey(); } }
public class GroupCount { public int Age { get; set; } public int GroupCounts { get; set; } }
三、EF对象的状态
EF中的对象有五个状态: Derached(游离态,脱离态),Unchange(未改变),Added(新增),Deleted(删除),Modified(被修改)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~