分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

Asp.Net MVC EF之二:原生EF插入,更新数据的正确方法

发布时间:2023-09-06 02:11责任编辑:沈小雨关键词:MVC

引言

EF是相对与Dapper、NHibernate官方首推的ORM框架,其在开发过程中的方便,快捷毋庸置疑的,但由于EF本身的一些缓存机制、跟踪机制,所以在使用时有些地方需要特别注意。

下面我将自己在项目中的总结的一些经验 分享出来,希望能帮助大家正确的使用EF。

正文

1. 插入数据

不建议的做法:

dbcontext.entity.Add(_entity); dbcontext.SaveChanges();

正确的做法:

dbcontext.Entry<TEntity>(entity).State = EntityState.Added;dbcontext.SaveChanges();

.SaveChanges() 会返回一个受影响条数的Int值

2. 更新数据

不建议的做法:

var entity = dbcontext.Set<TEntity>().FirstOrDefault(predicate); //predicate表示唯一查询的Lambda表达式,当参数查询不唯一时,次表达式只会取第一条entity.t_Name = "张三2";dbcontext.SaveChanges();

注意:此种做法 必须将主键传递进来重新查询一遍,防止与其他加了.AsNoTracking()的方法混用,.AsNoTracking()的作用是放弃对EF对象的跟踪,这样对属性进行重新赋值后,调用.SaveChanges()将会失效。

正确的做法:

var entity = dbcontext.Set<TEntity>().Single(predicate); //predicate表示唯一查询的Lambda表达式,当参数查询不唯一时,将会报错entity.t_Name = "张三2";dbcontext.Set<TEntity>().Attach(entity);dbcontext.Entry(entity).Property(a => a.t_Name).IsModified = true; //将EF对t_Name的管理状态设置为是一个更新dbcontext.SaveChanges();

上面的做法必将导致如果要改多个字段,就必须重复的对IsModified进行设置。

我们进一步对修改方法做一个封装,封装方法如下:

 ???????public int Update(TEntity entity) ???????{ ???????????dbcontext.Set<TEntity>().Attach(entity); ???????????PropertyInfo[] props = entity.GetType().GetProperties(); ???????????foreach (PropertyInfo prop in props) ???????????{ ???????????????if (prop.GetValue(entity, null) != null) ???????????????{ ???????????????????if (prop.GetValue(entity, null).ToString() == " ") ???????????????????????dbcontext.Entry(entity).Property(prop.Name).CurrentValue = null; ???????????????????dbcontext.Entry(entity).Property(prop.Name).IsModified = true; ???????????????} ???????????} ???????????return dbcontext.SaveChanges(); ???????}

TEntity:表示一个泛型类,对泛型类还不了解的朋友可以百度一下泛型类或者阅读这篇文章 C#中泛型类,泛型方法,泛型约束实际应用 补一补。

之后我会出一篇对EF处理机制的详细介绍,提供给大家参考,也是对自己知识经验的一个总结!

Asp.Net MVC EF之二:原生EF插入,更新数据的正确方法

原文地址:https://www.cnblogs.com/ydcnblog/p/9533357.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved