zoukankan      html  css  js  c++  java
  • 使用VS2017创建EF框架实例

    本文例子中使用环境:vs2017,sql server 2008

     一,创建EF项目

    1,解决方案添加.Net Framework类库项目,在新建的项目下新建项:data->ADO.NET实体数据模型->来自数据库的EF设计器,填写数据库连接,选择包含的内容,完成创建。

     1,创建类库       2,创建EF

    二,创建接口及方法封装

    此过程可参考文章《关于EF 通用增删改查的封装》,这里复制下代码。

    using System;
    using System.Collections.Generic;
    using System.Linq.Expressions;
    using System.Data;
    using MySql.Data.MySqlClient;
    /************************************************
    ◇作者: LowKeyC
    ◇说明: 定义一个EF通用的CRUD的接口
    ◇版本号:V1.0
    ◇创建日期:2017年6月22日  星期四
    *****************************************************/
    
    namespace EFCommon.SqlHelp
    {
        public interface IRepository : IDisposable
        {
    
            /// <summary>
            /// 添加实体
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity"></param>
            /// <returns></returns>
            bool Add<T>(T Entity) where T : class;
    
            /// <summary>
            /// 批量的进行添加实体
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity"></param>
            /// <returns></returns>
            bool AddRange<T>(List<T> Entity) where T : class;
    
    
            /// <summary>
            /// 删除单个实体
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity"></param>
            /// <returns></returns>
            bool Delete<T>(T Entity) where T : class;
    
            /// <summary>
            /// 根据查询条件进行删除单个实体
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="whereLambda"></param>
            /// <returns></returns>
            bool Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class;
             
    
            /// <summary>
            ///单个对象的修改
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity">需要修改的对象</param>
            /// <returns></returns>
            bool Update<T>(T Entity) where T : class;
    
    
            /// <summary>
            /// 批量修改
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="whereLambda"></param>
            /// <param name="updateLambda"></param>
            /// <returns></returns>
            bool Update<T>(Expression<Func<T, bool>> WhereLambda, Expression<Func<T, T>> UpdateLambda) where T : class;
    
    
            /// <summary>
            /// 批量的修改
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity"></param>
            /// <returns></returns>
            bool Update<T>(List<T> Entity) where T : class;
    
    
            /// <summary>
            /// 批量统一的进行更新
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="model">需要修改的对象实体</param>
            /// <param name="WhereLambda">查询的条件</param>
            /// <param name="ModifiedProNames"></param>
            /// <returns></returns>
            bool Update<T>(T model, Expression<Func<T, bool>> WhereLambda, params string[] ModifiedProNames) where T : class;
    
    
            /// <summary>
            /// 根据主键进行查询
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="ID"></param>
            /// <returns></returns>
            T FindByID<T>(dynamic ID) where T : class;
    
            /// <summary>
            /// 默认查询选择第一条数据,没有那么进行返回NULL
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns>返回bool</returns>
            T GetFristDefault<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;
    
            /// <summary>
            /// 查询所有的数据
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <returns></returns>
            List<T> GetAll<T>(string Order = null) where T : class;
    
            /// <summary>
            /// 含有带条件的查询
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns></returns>
            List<T> GetAllQuery<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;
    
    
            /// <summary>
            ///获取查询的数量
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns></returns>
            int GetCount<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;
    
            /// <summary>
            /// 判断对象是否存在
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns></returns>
            bool GetAny<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class;
    
    
            /// <summary>
            /// 根据查询过条件进行分页
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <typeparam name="TKey"></typeparam>
            /// <param name="PageIndex">当前页面</param>
            /// <param name="PageSize">页面的大小</param>
            /// <param name="TotalCount">总记录数</param>
            /// <param name="OrderBy">排序的条件</param>
            /// <param name="WhereLambda">查询条件</param>
            /// <param name="IsOrder">是否正序</param>
            /// <returns></returns>
            List<T> Pagination<T, TKey>(int PageIndex, int PageSize, out int TotalCount, Expression<Func<T, TKey>> OrderBy, Expression<Func<T, bool>> WhereLambda = null, bool IsOrder = true) where T : class;
    
    
            /// <summary>
            /// 根据查询条件进行做分页查询
            /// </summary>
            /// <typeparam name="T">查询的对象</typeparam>
            /// <param name="PageIndex">当前的页码</param>
            /// <param name="PageSize">每页的大小</param>
            /// <param name="TotalCount">总页数</param>
            /// <param name="ordering">排序条件</param>
            /// <param name="WhereLambda">查询条件</param>
            /// <returns></returns>
            List<T> Pagination<T>(int PageIndex, int PageSize, out int TotalCount, string ordering, Expression<Func<T, bool>> WhereLambda = null) where T : class;
    
    
            /// <summary>
            /// 根据查询条件进行转化
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns></returns>
            List<T> GetSelect<T>(Expression<Func<T, bool>> WhereLambda) where T : class;
    
    
            /// <summary>
            /// 执行存储过程或自定义sql语句--返回集合
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Sql"></param>
            /// <param name="Parms"></param>
            /// <param name="CmdType"></param>
            /// <returns></returns>
            List<T> QueryPro<T>(string Sql, List<MySqlParameter> Parms, CommandType CmdType = CommandType.Text) where T : class;
    
    
            /// <summary>
            /// 回滚
            /// </summary>
            /// <typeparam name="T"></typeparam>
            void RollBackChanges<T>() where T : class;
    
        }
    }
    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Transactions;
    using System.Data.Entity;
    using System.Linq.Expressions;
    using System.Data;
    using System.Linq.Dynamic;
    using EntityFramework.Extensions;
    using System.Reflection;
    using System.Data.Entity.Infrastructure;
    using MySql.Data.MySqlClient;
    /************************************************
    ◇作者: LowKeyC  需要引用这个程序集:EntityFramework.Extended.6.1.0.168
    ◇说明: 实现EF通用的CRUD通用的接口  
    ◇版本号:V1.0   
    ◇创建日期:2017年6月22日 星期四
    *****************************************************/
    namespace EFCommon.SqlHelp
    {
        public class Repository : IRepository, IDisposable
        {
    
            private readonly static  DbContext _DbContextHandle =new ahavadbEntities();//此处进行调用EF的DBContent 的实体类或者通过工厂化模式来进行调用。
    
            /// <summary>
            /// 添加一个对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity"></param>
            /// <returns></returns>
            public bool Add<T>(T Entity) where T : class
            {
                using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
                {
                    _DbContextHandle.Set<T>().Add(Entity);
                    int Count = _DbContextHandle.SaveChanges();
                    Ts.Complete();
                    return Count > 0;
                }
            }
    
            /// <summary>
            /// 批量的插入数据
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity"></param>
            /// <returns></returns>
            public bool AddRange<T>(List<T> Entity) where T : class
            {
                using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
                {
                    _DbContextHandle.Set<T>().AddRange(Entity);
                    int Count = _DbContextHandle.SaveChanges();
                    Ts.Complete();
                    return Count > 0;
                }
            }
    
            /// <summary>
            /// 根据查询条件进行删除对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="whereLambda">查询条件</param>
            /// <returns></returns>
            public bool Delete<T>(Expression<Func<T, bool>> whereLambda) where T : class
            {
                using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
                {
                    var EntityModel = _DbContextHandle.Set<T>().Where(whereLambda).FirstOrDefault();
                    if (EntityModel != null)
                    {
                        _DbContextHandle.Set<T>().Remove(EntityModel);
                        int Count = _DbContextHandle.SaveChanges();
                        Ts.Complete();
                        return Count > 0;
                    }
                    return false;
                }
            }
    
    
            /// <summary>
            /// 删除单个对象的实体
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity">实体对象</param>
            /// <returns></returns>
            public bool Delete<T>(T Entity) where T : class
            {
                using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
                {
                    _DbContextHandle.Set<T>().Attach(Entity);
                    _DbContextHandle.Set<T>().Remove(Entity);
                    int Count = _DbContextHandle.SaveChanges();
                    Ts.Complete();
                    return Count > 0;
                }
            }
    
            /// <summary>
            /// 批量的进行更新数据
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity"></param>
            /// <returns></returns>
            public bool Update<T>(List<T> Entity) where T : class
            {
                int Count = 0;
                using (TransactionScope Ts = new TransactionScope(TransactionScopeOption.Required))
                {
                    if (Entity != null)
                    {
                        foreach (var items in Entity)
                        {
                            var EntityModel = _DbContextHandle.Entry(Entity);
                            _DbContextHandle.Set<T>().Attach(items);
                            EntityModel.State = EntityState.Modified;
                        }
    
                    }
                    Count = _DbContextHandle.SaveChanges();
                    Ts.Complete();
                }
    
                return Count > 0;
            }
    
    
            /// <summary>
            /// 进行修改单个实体对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Entity">实体对象</param>
            /// <returns></returns>
            public bool Update<T>(T Entity) where T : class
            {
                using (TransactionScope Ts = new TransactionScope())
                {
                    var EntityModel = _DbContextHandle.Entry<T>(Entity);
                    _DbContextHandle.Set<T>().Attach(Entity);
                    EntityModel.State = EntityState.Modified;
                    int Count = _DbContextHandle.SaveChanges();
                    Ts.Complete();
                    return Count > 0;
                }
            }
    
            /// <summary>
            /// 批量的修改
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <param name="UpdateLambda"></param>
            /// <returns></returns>
            public bool Update<T>(Expression<Func<T, bool>> WhereLambda, Expression<Func<T, T>> UpdateLambda) where T : class
            {
                _DbContextHandle.Set<T>().Where(WhereLambda).Update<T>(UpdateLambda);
                return _DbContextHandle.SaveChanges() > 0;
            }
    
    
            /// <summary>
            /// 查询条件进行修改
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="model"></param>
            /// <param name="WhereLambda"></param>
            /// <param name="ModifiedProNames"></param>
            /// <returns></returns>
            public bool Update<T>(T model, Expression<Func<T, bool>> WhereLambda, params string[] ModifiedProNames) where T : class
            {
                //查询要修改的数据
                List<T> ListModifing = _DbContextHandle.Set<T>().Where(WhereLambda).ToList();
                Type t = typeof(T);
                List<PropertyInfo> ProInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();
                Dictionary<string, PropertyInfo> DitProList = new Dictionary<string, PropertyInfo>();
                ProInfos.ForEach(p =>
                {
                    if (ModifiedProNames.Contains(p.Name))
                    {
                        DitProList.Add(p.Name, p);
                    }
                });
    
                if (DitProList.Count <= 0)
                {
                    throw new Exception("指定修改的字段名称有误或为空");
                }
                foreach (var item in DitProList)
                {
                    PropertyInfo proInfo = item.Value;
                    object newValue = proInfo.GetValue(model, null);
                    //批量进行修改相互对应的属性
                    foreach (T oModel in ListModifing)
                    {
                        proInfo.SetValue(oModel, newValue, null);//设置其中新的值
                    }
                }
    
                return _DbContextHandle.SaveChanges() > 0;
            } 
            /// <summary>
            /// 释放缓存
            /// </summary>
            public void Dispose()
            {
                _DbContextHandle.Dispose();
            }
    
            /// <summary>
            /// 查询单个对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="ID">主键ID</param>
            /// <returns></returns>
            public T FindByID<T>(dynamic ID) where T : class
            {
                return _DbContextHandle.Set<T>().Find(ID) ?? null;
            }
    
    
            /// <summary>
            /// 获取全部数据的列表
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Order">排序</param>
            /// <returns></returns>
            public List<T> GetAll<T>(string Order = null) where T : class
            {
                return Order != null ? _DbContextHandle.Set<T>().OrderBy(Order).ToList() ?? null : _DbContextHandle.Set<T>().ToList() ?? null;
            }
    
            /// <summary>
            ///根据查询条件进行查询列表
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns></returns>
            public List<T> GetAllQuery<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class
            {
                return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).ToList() ?? null : _DbContextHandle.Set<T>().ToList() ?? null;
            }
    
            /// <summary>
            ///判断对象是否存在
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns></returns>
            public bool GetAny<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class
            {
                return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).Any() : _DbContextHandle.Set<T>().Any();
            }
    
            /// <summary>
            /// 获取查询条件的记录数
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns></returns>
            public int GetCount<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class
            {
                return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).Count() : _DbContextHandle.Set<T>().Count();
            }
    
    
            /// <summary>
            /// 获取单条的记录
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns></returns>
            public T GetFristDefault<T>(Expression<Func<T, bool>> WhereLambda = null) where T : class
            {
                return WhereLambda != null ? _DbContextHandle.Set<T>().Where(WhereLambda).FirstOrDefault() ?? null : _DbContextHandle.Set<T>().FirstOrDefault() ?? null;
            }
    
    
            /// <summary>
            /// 查询对象的转化
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="WhereLambda"></param>
            /// <returns></returns>
            public List<T> GetSelect<T>(Expression<Func<T, bool>> WhereLambda) where T : class
            {
                return _DbContextHandle.Set<T>().Where(WhereLambda).ToList() ?? null;
            }
    
            /// <summary>
            ///根据查询条件进行分页
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="PageIndex">当前页</param>
            /// <param name="PageSize">每页的大小</param>
            /// <param name="TotalCount">总记录数</param>
            /// <param name="ordering">排序条件</param>
            /// <param name="WhereLambda">查询条件</param>
            /// <returns></returns>
            public List<T> Pagination<T>(int PageIndex, int PageSize, out int TotalCount, string Ordering, Expression<Func<T, bool>> WhereLambda = null) where T : class
            {
                //分页的时候一定要注意 Order 一定在Skip 之前
                var QueryList = _DbContextHandle.Set<T>().OrderBy(Ordering);
                if (WhereLambda != null)
                {
                    QueryList = QueryList.Where(WhereLambda);
                }
    
                TotalCount = QueryList.Count();
                return QueryList.Skip(PageSize * (PageIndex - 1)).Take(PageSize).ToList() ?? null;
            }
    
            /// <summary>
            ///根据查询条件进行分页
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="PageIndex">当前页</param>
            /// <param name="PageSize">每页的大小</param>
            /// <param name="TotalCount">总记录数</param>
            /// <param name="OrderBy">排序条件</param>
            /// <param name="WhereLambda">查询的条件</param>
            /// <param name="IsOrder"></param>
            /// <returns></returns>
            public List<T> Pagination<T, TKey>(int PageIndex, int PageSize, out int TotalCount, Expression<Func<T, TKey>> OrderBy, Expression<Func<T, bool>> WhereLambda = null, bool IsOrder = true) where T : class
            {
                //分页的时候一定要注意 Order一定在Skip 之前
                IQueryable<T> QueryList = IsOrder == true ? _DbContextHandle.Set<T>().OrderBy(OrderBy) : _DbContextHandle.Set<T>().OrderByDescending(OrderBy);
    
                if (WhereLambda != null)
                {
                    QueryList = QueryList.Where(WhereLambda);
                }
    
                TotalCount = QueryList.Count();
                return QueryList.Skip(PageSize * (PageIndex - 1)).Take(PageSize).ToList() ?? null;
            }
    
    
            /// <summary>
            /// 执行存储过程的SQL 语句
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="Sql">执行的SQL语句</param>
            /// <param name="Parms">SQL 语句的参数</param>
            /// <param name="CmdType"></param>
            /// <returns></returns>
            public List<T> QueryPro<T>(string Sql, List<MySqlParameter> Parms, CommandType CmdType = CommandType.Text) where T : class
            {
                //进行执行存储过程
                if (CmdType == CommandType.StoredProcedure)
                {
                    StringBuilder paraNames = new StringBuilder();
                    foreach (var item in Parms)
                    {
                        paraNames.Append($" @{item},");
                    }
                    Sql = paraNames.Length > 0 ? $"exec {Sql} {paraNames.ToString().Trim(',')}" : $"exec {Sql} ";
                }
                return _DbContextHandle.Set<T>().SqlQuery(Sql, Parms.ToArray()).ToList();
            }
    
    
            /// <summary>
            /// 进行回滚
            /// </summary>
            /// <typeparam name="T"></typeparam>
            public void RollBackChanges<T>() where T : class
            {
                var Query = _DbContextHandle.ChangeTracker.Entries().ToList();
    
                Query.ForEach(p => p.State = EntityState.Unchanged);
            }
    
        }
    }
    View Code

    因本人使用的是sql server,因此修改这部分的mysql,改用System.Data.SqlClient。采用上面的代码,应该会报错在OrderBy(string),因为构建的是LambdaExpression 类型的,这位大神给出了很好的解决方案,一起去看看吧——c# 扩展方法 奇思妙用 高级篇 九:OrderBy(string propertyName, bool desc)

    三,使用注意事项

    1,需要把EF的配置拷贝到主程序配置里。

    2,在主程序配置中添加entityFramework的节点配置

      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="mssqllocaldb"/>
          </parameters>
        </defaultConnectionFactory>
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
        </providers>
      </entityFramework>

    3,在主程序中NuGet包中添加下EntityFramework

     

  • 相关阅读:
    OpenFileDialog 类的ShowDialog() 错误的解决
    DataTable.Select()使用心得
    postgis 自相交数据检测 修复
    postgresql 添加列主键自增
    postgresql 死锁处理
    linux 安装中文字体(生成图片中文乱码解决)
    Dockerfile 部署jar
    SpringBoot学习总结文章
    怎样在Linux服务器上部署自己的项目?(超详细)
    关于连接Redis时Could not get a resource from the pool问题
  • 原文地址:https://www.cnblogs.com/squirrel-king/p/12119411.html
Copyright © 2011-2022 走看看