开发者社区> 磊哥聊Java> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

entity framework不查数据库修改或排除指定字段集合通用方法

简介: 其中DataDBEntities为数据库实体对象,代码如下: 下载地址:http://files.cnblogs.com/stone_w/EFDBHelper.zip using System; using System.
+关注继续查看

其中DataDBEntities为数据库实体对象,代码如下:

下载地址:http://files.cnblogs.com/stone_w/EFDBHelper.zip

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Data.Objects.DataClasses;
public class EFDBHelper
{

    #region 不查数据库修改信息
    /// <summary>
    /// 不查数据库修改信息
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="entity"></param>
    /// <param name="db"></param>
    /// <param name="updateFiledType"></param>
    /// <param name="fileds"></param>
    /// <returns></returns>
    public static int Update<T>(T entity, DataDBEntities db,
        EnumUpdateFiledType updateFiledType, params string[] fileds)
    {
        if (null == db || null == entity)
        { // 参数有误
            return 0;
        }
        Type _type = typeof(T);
        db.AttachTo(_type.Name, entity);
        if (null == fileds || fileds.Length == 0)
        { // 全字段操作
            db.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);      // 手动设置为修改状态
        }
        else
        { // 部分字段操作
            var _stateEntry = db.ObjectStateManager.GetObjectStateEntry(entity);                    // 得到实体状态
            if (EnumUpdateFiledType.字段修改 == updateFiledType)
            { // 部分字段修改
                for (int i = 0; i < fileds.Length; i++)
                {
                    _stateEntry.SetModifiedProperty(fileds[i]);
                }
            }
            else
            { // 部分字段排除
                PropertyInfo[] _properties = _type.GetProperties(); // 得到类的所有属性
                foreach (PropertyInfo item in _properties)
                {
                    if ("EntityState" == item.Name || "EntityKey" == item.Name)
                    {
                        continue;
                    }
                    // 主键判断 [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] 根据特性判断主键
                    EdmScalarPropertyAttribute _edmScalarPropertyAttribute = 
              Attribute.GetCustomAttribute(item, typeof(EdmScalarPropertyAttribute)) as EdmScalarPropertyAttribute; if (null == _edmScalarPropertyAttribute || _edmScalarPropertyAttribute.EntityKeyProperty) { // 为主键或者导航属性 continue; } bool _thisIsUpdateFiled = true; // 是否为修改字段 for (int i = 0; i < fileds.Length; i++) { if (item.Name == fileds[i]) { _thisIsUpdateFiled = false; break; } } if (_thisIsUpdateFiled) _stateEntry.SetModifiedProperty(item.Name); } } } return db.SaveChanges(); } /// <summary> /// 不查数据库修改信息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entity"></param> /// <param name="db"></param> /// <returns></returns> public static int Update<T>(T entity, DataDBEntities db) { if (null == db || null == entity) { // 参数有误 return 0; } Type _type = typeof(T); db.AttachTo(_type.Name, entity); db.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified); // 手动设置为修改状态 return db.SaveChanges(); } /// <summary> /// 不查数据库修改信息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entity"></param> /// <param name="updateFiledType"></param> /// <param name="fileds"></param> /// <returns></returns> public static int Update<T>(T entity, EnumUpdateFiledType updateFiledType, params string[] fileds) { if (null == entity) { // 参数有误 return 0; } using (DataDBEntities db = new DataDBEntities()) { Type _type = typeof(T); db.AttachTo(_type.Name, entity); if (null == fileds || fileds.Length == 0) { // 全字段操作 db.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified); // 手动设置为修改状态 } else { // 部分字段操作 var _stateEntry = db.ObjectStateManager.GetObjectStateEntry(entity); // 得到实体状态 if (EnumUpdateFiledType.字段修改 == updateFiledType) { // 部分字段修改 for (int i = 0; i < fileds.Length; i++) { _stateEntry.SetModifiedProperty(fileds[i]); } } else { // 部分字段排除 PropertyInfo[] _properties = _type.GetProperties(); // 得到类的所有属性 foreach (PropertyInfo item in _properties) { if ("EntityState" == item.Name || "EntityKey" == item.Name) { continue; } // 主键判断 [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] 根据特性判断主键 EdmScalarPropertyAttribute _edmScalarPropertyAttribute =
                Attribute.GetCustomAttribute(item, typeof(EdmScalarPropertyAttribute)) as EdmScalarPropertyAttribute; if (null == _edmScalarPropertyAttribute || _edmScalarPropertyAttribute.EntityKeyProperty) { // 为主键或者导航属性 continue; } bool _thisIsUpdateFiled = true; // 是否为修改字段 for (int i = 0; i < fileds.Length; i++) { if (item.Name == fileds[i]) { _thisIsUpdateFiled = false; break; } } if (_thisIsUpdateFiled) _stateEntry.SetModifiedProperty(item.Name); } } } return db.SaveChanges(); } } /// <summary> /// 不查数据库修改信息 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entity"></param> /// <returns></returns> public static int Update<T>(T entity) { if (null == entity) { // 参数有误 return 0; } using (DataDBEntities db = new DataDBEntities()) { Type _type = typeof(T); db.AttachTo(_type.Name, entity); db.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified); // 手动设置为修改状态 return db.SaveChanges(); } } #endregion } #region 修改时字段处理枚举 /// <summary> /// 修改时字段处理枚举 /// </summary> public enum EnumUpdateFiledType { 字段修改 = 1, 字段忽略 = 2 } #endregion

 

 

img_fa0be433d68c8212b2b0b3b1a564ccb1.png
如果本文对你有所帮助,请打赏——1元就足够感动我:)
支付宝打赏微信打赏
联系邮箱:intdb@qq.com
我的GitHub: https://github.com/vipstone
关注公众号: img_9bde0f31ac4a0eca10b1bd7414b78faf.png


作者: 王磊
出处: http://vipstone.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,请标明出处。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
在Entity Framework中重用现有的数据库连接字符串
本文转载:http://www.cnblogs.com/dudu/archive/2011/01/29/entity_framework_connection_string.html 如果EF在使用实体模型时候,即model first 和db first 时候,则 Entity Framework使用的连接字符串与ADO.NET是不同的,见下图: 相比于ADO.NET,Entity Framework的连接字符串不仅要存放metadata配置信息,还要存放完整的数据库连接字符串(上图中的"provider connection string"部分)。
910 0
【C#】Entity Framework 增删改查和事务操作
1、增加对象   DbEntity db = new DbEntity(); //创建对象实体,注意,这里需要对所有属性进行赋值(除了自动增长主键外),如果不赋值,则会数据库中会被设置为NULL(注意是否可空) v...
935 0
Entity Framework 系统约定配置
原文:Entity Framework 系统约定配置 前言 Code First之所以能够让开发人员以一种更加高效、灵活的方式进行数据操作有一个重要的原因在于它的约定配置。现在软件开发越来越复杂,大家都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的,但是过多的配置也会带来很大的工作量,解决这个问题的方法就是约定。
768 0
Entity Framework 简单增删改操作
原文:Entity Framework 简单增删改操作 前言  在 Entity Framework 简单查询操作 中主要是学习了在Entity Framework中的几种不同模式的查询操作,现在主要来学习一下简单的增加、删除、修改操作。
814 0
Entity Framework初探
近期公司打算使用EF,于是这两天我特地研究了它的一些特性。本文记录的是我的一些研究成果。。。哎哟,说成果是不是大了点? ps:对于EF,每次它有新版发布,我都一笑而过,为啥?因为我一直非常安逸于使用一个叫IQToolkit的开源组件,该组件作者有专门写了一系列博文记录IQToolkit从无到有的诞生历程,我估计市面上很多基于Linq的ORM或多或少都借鉴过他的经验[和代码]。
1097 0
+关注
磊哥聊Java
是非审之于己,毁誉听之于人,得失安之于数。欢迎关注我的公众号「Java中文社群」
786
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载