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

其中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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏angularejs学习篇

.net捕捉全局未处理异常的3种方式

 我们在实际项目开发中,经常会遇到一些不可预见的异常产生,有的异常在程序运行时就对其进行处理(try) 但是,有的程序不需要每一个地方都用try进行处理,那么针...

1843
来自专栏大内老A

Dora.Interception,为.NET Core度身打造的AOP框架:全新的版本

Dora.Interception 1.0(Github地址:可以访问GitHub地址:https://github.com/jiangjinnan/Dora)...

3465
来自专栏王磊的博客

Thread线程的深刻理解和代理方法参数[有图有真相]

在这说的是Thread的基本用法,线程池ThreadPool在这就不说的,以前的blog有写,基本上两个用法都是相同的。基本用法和图,不需要的大鸟请绕行,谢谢!...

3298
来自专栏分布式系统进阶

记一次使用Zookeeper C API导致的内存泄漏

可以看到 definitely lost: 24 bytes in 1 blocks

1933
来自专栏恰同学骚年

NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

  首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库。目前最流行的就是S...

681
来自专栏更流畅、简洁的软件开发方式

数据访问函数库 for ado.net2.0

前言 源代码和调用演示下载:http://www.cnblogs.com/jyk/archive/2008/04/25/1170979.html 数据访问函...

1927
来自专栏大内老A

WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效

本篇文章来源于几天前一个朋友向我咨询的问题。问题是这样的,他说他采用ASP.NET应用程序的方式对定义的WCF服务进行寄宿(Hosting),并使用配置的方式对...

1877
来自专栏老马说编程

(94) 组合式异步编程 / 计算机程序的思维逻辑

前面两节讨论了Java 8中的函数式数据处理,那是对38节到55节介绍的容器类的增强,它可以将对集合数据的多个操作以流水线的方式组合在一起。本节继续讨论Java...

2007
来自专栏游戏开发那些事

【游戏开发】Excel表格批量转换成lua的转表工具

  在上篇博客《【游戏开发】Excel表格批量转换成CSV的小工具》 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用。实际在U...

2053
来自专栏WebApiClient

WebApiClient基础

如果接口IMyWebApi有多个方法且都指向同一服务器,可以将请求的域名抽出来放到HttpHost特性。

3830

扫码关注云+社区