• Entity Framework


    EF有三种方式来进行数据操作及持久化。分别是Database-First,Model-First,Code-first

    Database First

      是基于已存在的数据库,利用某些工具(如Vs提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件。

    Model First 

      这种方式是先利用某些工具(如VS的EF设计器)设计出实体数据模型及他们之间的关系,然后再根据这些实体、关系去生成数据库对象及相关代码文件。

    Code First 

      这种方式需要先写一些代码,如实体对象,数据关系等,然后根据已有的代码描述,自动创建数据对象,这种方式在前一篇文章已经简单说过了。但其实这种方法与Model First是非常类似的。我们自己写的代码,其实就是用代码表示实体模型,而Model First是用可视化的方式描述了实体模型。

      code First方法默认情况下是以命名空间.DBcontext类名来作为自动创建的数据库名称

      code First这种方式也可以用于已存在的数据库,具体作法如下:

      第一步:在app.config或者web.config中配置数据库连接字符串

      <connectionStrings>
        <add name="PermissionEntities" connectionString="Data Source=(local); Database=PermissionData; User ID=sa; Password=123456;" providerName="System.Data.SqlClient" />
      </connectionStrings>

      第二步:是让DBcontext获取已存在数据库,在构造DBcontext时,指定使用这个连接字符串

      

      /// <summary>
        /// The permission entities.
        /// </summary>
        public class PermissionEntities : DbContext
        {
            /// <summary>
            /// Gets or sets the users.
            /// </summary>
            public DbSet<User> Users { get; set; }
    
            /// <summary>
            /// Gets or sets the user role relationships.
            /// </summary>
            public DbSet<UserRoleRelationship> UserRoleRelationships { get; set; }
    
            /// <summary>
            /// Gets or sets the roles.
            /// </summary>
            public DbSet<Role> Roles { get; set; }
    
            /// <summary>
            /// Gets or sets the role permission relationships.
            /// </summary>
            public DbSet<RolePermissionRelationship> RolePermissionRelationships { get; set; }
    
            /// <summary>
            /// Gets or sets the permissions.
            /// </summary>
            public DbSet<Permission> Permissions { get; set; }
    
            /// <summary>
            /// Gets or sets the menu permissions.
            /// </summary>
            public DbSet<MenuPermission> MenuPermissions { get; set; }
    
            /// <summary>
            /// Gets or sets the module permissions.
            /// </summary>
            public DbSet<ModulePermission> ModulePermissions { get; set; }
        }

      第三步:添加要匹配的类以及匹配关系。

        /// <summary>
        /// 用户
        /// </summary>
        public class User
        {
            /// <summary>
            /// 编号
            /// </summary>
            [Key]
            public Guid Id { get; set; }
    
            /// <summary>
            /// 部门Id
            /// </summary>
            public Guid DepartmentId { get; set; }
    
            /// <summary>
            /// 用户名
            /// </summary>
            [Required]
            [MaxLength(255)]
            [Column(TypeName = "Varchar")]
            public string UserName { get; set; }
    
            /// <summary>
            /// 密码
            /// </summary>
            [Required]
            [MaxLength(32)]
            [Column(TypeName = "Char")]
            public string Password { get; set; }
    
            /// <summary>
            /// /昵称
            /// </summary>
            [Required]
            [MaxLength(255)]
            public string NickName { get; set; }
    
            /// <summary>
            /// 邮件
            /// </summary>
            [Required]
            [MaxLength(255)]
            [Column(TypeName = "Varchar")]
            public string Email { get; set; }
    
            /// <summary>
            /// 手机
            /// </summary>
            [Required]
            [MaxLength(11)]
            [Column(TypeName = "Char")]
            public string Mobile { get; set; }
    
            /// <summary>
            /// 启用 禁用
            /// </summary>
            [Required]
            public bool Enabled { get; set; }
    
            /// <summary>
            /// 是否是管理员账号
            /// </summary>
            [Required]
            public bool IsAdministrator { get; set; }
    
            /// <summary>
            /// 注册时间
            /// </summary>
            [Required]
            public DateTime RegisterDate { get; set; }
    
            /// <summary>
            /// 禁用登录Ip
            /// </summary>
            public string IpLimitation { get; set; }
    
            /// <summary>
            /// 备注
            /// </summary>
            public string Remark { get; set; }
    
            /// <summary>
            /// Gets or sets the user role relationships.
            /// </summary>
            public ICollection<UserRoleRelationship> UserRoleRelationships { get; set; }
        }
    
        /// <summary>
        /// 用户角色关系
        /// </summary>
        public class UserRoleRelationship
        {
            /// <summary>
            /// Id
            /// </summary>
            [Key]
            public Guid Id { get; set; }
    
            /// <summary>
            /// 角色Id
            /// </summary>
            [Required]
            public Guid RoleId { get; set; }
    
            /// <summary>
            /// 用户Id
            /// </summary>
            [Required]
            public Guid UserId { get; set; }
    
            /// <summary>
            /// Gets or sets the user.
            /// </summary>
            public virtual User User { get; set; }
    
            /// <summary>
            /// Gets or sets the role.
            /// </summary>
            public virtual Role Role { get; set; }
        }
    
        /// <summary>
        /// 角色
        /// </summary>
        public class Role
        {
            /// <summary>
            /// 编号
            /// </summary>
            [Key]
            public Guid Id { get; set; }
    
            /// <summary>
            /// 父角色Id
            /// </summary>
            public Guid? ParentId { get; set; }
    
            /// <summary>
            /// 角色名称
            /// </summary>
            [Required]
            [MaxLength(255)]
            public string Name { get; set; }
    
            /// <summary>
            /// 是否禁用
            /// </summary>
            [Required]
            public bool Enabled { get; set; }
    
            /// <summary>
            /// 备注
            /// </summary>
            public string Remark { get; set; }
    
            /// <summary>
            /// Gets or sets the user role relationships.
            /// </summary>
            public ICollection<UserRoleRelationship> UserRoleRelationships { get; set; }
    
            /// <summary>
            /// Gets or sets the role permission relationships.
            /// </summary>
            public ICollection<RolePermissionRelationship> RolePermissionRelationships { get; set; }
        }
    
        /// <summary>
        /// 角色权限关系
        /// </summary>
        public class RolePermissionRelationship
        {
            /// <summary>
            /// Gets or sets the id.
            /// </summary>
            [Key]
            public Guid Id { get; set; }
    
            /// <summary>
            /// 角色Id
            /// </summary>
            [Required]
            public Guid RoleId { get; set; }
    
            /// <summary>
            /// 权限Id
            /// </summary>
            [Required]
            public Guid PermissionId { get; set; }
    
            /// <summary>
            /// Gets or sets the role.
            /// </summary>
            public virtual Role Role { get; set; }
    
            /// <summary>
            /// Gets or sets the permission.
            /// </summary>
            public virtual Permission Permission { get; set; }
        }
    
        /// <summary>
        /// 权限
        /// </summary>
        public class Permission
        {
            /// <summary>
            /// 编号
            /// </summary>
            [Key]
            public Guid Id { get; set; }
    
            /// <summary>
            /// 权限名称
            /// </summary>
            [Required]
            [MaxLength(255)]
            public string Name { get; set; }
    
            /// <summary>
            /// 是否禁用
            /// </summary>
            [Required]
            public bool Enabled { get; set; }
    
            /// <summary>
            /// 备注
            /// </summary>
            public string Remark { get; set; }
    
            /// <summary>
            /// Gets or sets the role permission relationships.
            /// </summary>
            public ICollection<RolePermissionRelationship> RolePermissionRelationships { get; set; }
    
            /// <summary>
            /// Gets or sets the menu permissions.
            /// </summary>
            public ICollection<MenuPermission> MenuPermissions { get; set; }
        }
    
        /// <summary>
        /// 菜单权限
        /// </summary>
        public class MenuPermission
        {
            /// <summary>
            /// 编号
            /// </summary>
            [Key]
            public Guid Id { get; set; }
    
            /// <summary>
            /// 菜单父级菜单
            /// </summary>
            public Guid? ParentId { get; set; }
    
            /// <summary>
            /// 权限Id(属于那个权限)
            /// </summary>
            [Required]
            public virtual Guid PermissionId { get; set; }
    
            /// <summary>
            /// 名字
            /// </summary>
            [Required]
            [MaxLength(255)]
            public string Name { get; set; }
    
            /// <summary>
            /// 菜单地址
            /// </summary>
            [Required]
            [MaxLength(255)]
            public string Address { get; set; }
    
            /// <summary>
            /// 是否禁用
            /// </summary>
            [Required]
            public bool Enabled { get; set; }
    
            /// <summary>
            /// 菜单类型
            /// </summary>
            [Required]
            public byte Type { get; set; }
    
            /// <summary>
            /// 是否显示菜单
            /// </summary>
            [Required]
            public bool Display { get; set; }
    
            /// <summary>
            /// 排序
            /// </summary>
            [Required]
            public int Sort { get; set; }
    
            /// <summary>
            /// 深度
            /// </summary>
            [Required]
            public int Depth { get; set; }
    
            /// <summary>
            /// 备注
            /// </summary>
            public string Remark { get; set; }
    
            /// <summary>
            /// Gets or sets the module permissions.
            /// </summary>
            public ICollection<ModulePermission> ModulePermissions { get; set; }
        }
    
        /// <summary>
        /// 模块
        /// </summary>
        public class ModulePermission
        {
            /// <summary>
            /// 编号
            /// </summary>
            [Key]
            public Guid Id { get; set; }
    
            /// <summary>
            /// 父级模块Id
            /// </summary>
            public Guid? ParentId { get; set; }
    
            /// <summary>
            /// 菜单Id(属性那个菜单)
            /// </summary>
            [Required]
            public virtual Guid MenuPermissionId { get; set; }
    
            /// <summary>
            /// 名字
            /// </summary>
            [Required]
            [MaxLength(255)]
            public string Name { get; set; }
    
            /// <summary>
            /// 模块内容(比如Id)
            /// </summary>
            [Required]
            [MaxLength(255)]
            public string Content { get; set; }
    
            /// <summary>
            /// 类型(增删改查)
            /// </summary>
            [Required]
            public byte Type { get; set; }
    
            /// <summary>
            /// 是否禁用
            /// </summary>
            [Required]
            public bool Enabled { get; set; }
    
            /// <summary>
            /// 备注
            /// </summary>
            public string Remark { get; set; }
        }

    第四步:获取数据

      

           /// <summary>
            /// 测试链接数据库.
            /// </summary>
            public static void AddPermission()
            {
                Role r = new Role
                {
                    Name = "sdsd",
                    Id = Guid.NewGuid(),
                    Enabled = true,
                    ParentId = Guid.NewGuid(),
                    Remark = "sdsdsd"
                };
    
                // 一定要引用 EntityFramework跟EntityFramework.SqlServer 这个2个dll
                // 也可以直接使用当前上下文实现(不推荐此方法)
                using (PermissionEntities p = new PermissionEntities())
                {
                    p.Roles.Add(r);
                    p.SaveChanges();
                }
            }

    这种方式其实是Database First,只是用我们自己写的类替换了由可视化工具生成类及xml文件。

    最终针对 底层仓储进行一下封装BaseRepository 此类定义为抽象类 主要提供增删改查的方法

        /// <summary>
        /// The base repository.
        /// </summary>
        public abstract class BaseRepository : IDisposable
        {
            /// <summary>
            /// The db context.
            /// </summary>
            protected readonly DbContext DBContext;
    
            /// <summary>
            /// Initializes a new instance of the <see cref="BaseRepository"/> class.
            /// </summary>
            /// <param name="dbContext">
            /// The db context.
            /// </param>
            protected BaseRepository(DbContext dbContext)
            {
                this.DBContext = dbContext;
            }
    
            /// <summary>
            /// The add entities.
            /// </summary>
            /// <param name="entity">
            /// The entity.
            /// </param>
            /// <param name="isSubmit">
            /// The is submit.
            /// </param>
            /// <typeparam name="T">
            /// </typeparam>
            public abstract void AddEntities<T>(T entity, bool isSubmit = false) where T : class;
    
            /// <summary>
            /// The update entities.
            /// </summary>
            /// <param name="entity">
            /// The entity.
            /// </param>
            /// <param name="isSubmit">
            /// The is submit.
            /// </param>
            /// <typeparam name="T">
            /// </typeparam>
            public abstract void UpdateEntities<T>(T entity, bool isSubmit = false) where T : class;
    
            /// <summary>
            /// The delete entities.
            /// </summary>
            /// <param name="entity">
            /// The entity.
            /// </param>
            /// <param name="isSubmit">
            /// The is submit.
            /// </param>
            /// <typeparam name="T">
            /// </typeparam>
            public abstract void DeleteEntities<T>(T entity, bool isSubmit = false) where T : class;
    
            /// <summary>
            /// The load entities m.
            /// </summary>
            /// <param name="wherelambda">
            /// The wherelambda.
            /// </param>
            /// <typeparam name="T">
            /// </typeparam>
            /// <returns>
            /// The <see cref="IQueryable"/>.
            /// </returns>
            public abstract IQueryable<T> LoadEntitiesM<T>(Func<T, bool> wherelambda) where T : class;
    
            /// <summary>
            /// The load pager entities.
            /// </summary>
            /// <param name="pageSize">
            /// The page size.
            /// </param>
            /// <param name="pageIndex">
            /// The page index.
            /// </param>
            /// <param name="total">
            /// The total.
            /// </param>
            /// <param name="whereLambda">
            /// The where lambda.
            /// </param>
            /// <param name="isAsc">
            /// The is asc.
            /// </param>
            /// <param name="orderByLambda">
            /// The order by lambda.
            /// </param>
            /// <typeparam name="TSource">
            /// </typeparam>
            /// <typeparam name="T">
            /// </typeparam>
            /// <returns>
            /// The <see cref="IQueryable"/>.
            /// </returns>
            public abstract IQueryable<T> LoadPagerEntities<TSource, T>(
                int pageSize,
                int pageIndex,
                out int total,
                Func<T, bool> whereLambda,
                bool isAsc,
                Func<T, TSource> orderByLambda) where T : class;
    
            /// <summary>
            /// 释放资源
            /// </summary>
            public virtual void Dispose()
            {
                if (this.DBContext != null)
                {
                    this.DBContext.Dispose();
                }
            }
        }

    下面用sqlserver数据做演示 主要用SqlRepository 实现仓储基类

        /// <summary>
        /// The sql repository.
        /// </summary>
        public class SqlRepository : BaseRepository
        {
            /// <summary>
            /// Initializes a new instance of the <see cref="SqlRepository"/> class.
            /// </summary>
            /// <param name="dbContext">
            /// The db context.
            /// </param>
            public SqlRepository(DbContext dbContext)
                : base(dbContext)
            {
            }
    
            /// <summary>
            /// The add entities.
            /// </summary>
            /// <param name="entity">
            /// The entity.
            /// </param>
            /// <param name="isSubmit">
            /// The is submit.
            /// </param>
            /// <typeparam name="T">
            /// </typeparam>
            public override void AddEntities<T>(T entity, bool isSubmit = false)
            {
                DBContext.Entry(entity).State = EntityState.Added;
                if (isSubmit)
                {
                    DBContext.SaveChanges();
                }
            }
    
            /// <summary>
            /// The update entities.
            /// </summary>
            /// <param name="entity">
            /// The entity.
            /// </param>
            /// <param name="isSubmit">
            /// The is submit.
            /// </param>
            /// <typeparam name="T">
            /// </typeparam>
            public override void UpdateEntities<T>(T entity, bool isSubmit = false)
            {
                DBContext.Set<T>().Attach(entity);
                DBContext.Entry(entity).State = EntityState.Modified;
                if (isSubmit)
                {
                    DBContext.SaveChanges();
                }
            }
    
            /// <summary>
            /// The delete entities.
            /// </summary>
            /// <param name="entity">
            /// The entity.
            /// </param>
            /// <param name="isSubmit">
            /// The is submit.
            /// </param>
            /// <typeparam name="T">
            /// </typeparam>
            public override void DeleteEntities<T>(T entity, bool isSubmit = false)
            {
                DBContext.Set<T>().Attach(entity);
                DBContext.Entry(entity).State = EntityState.Deleted;
                if (isSubmit)
                {
                    DBContext.SaveChanges();
                }
            }
    
            /// <summary>
            /// The load entities m.
            /// </summary>
            /// <param name="wherelambda">
            /// The wherelambda.
            /// </param>
            /// <typeparam name="T">
            /// </typeparam>
            /// <returns>
            /// The <see cref="IQueryable"/>.
            /// </returns>
            public override IQueryable<T> LoadEntitiesM<T>(Func<T, bool> wherelambda)
            {
                return DBContext.Set<T>().Where<T>(wherelambda).AsQueryable();
            }
    
            /// <summary>
            /// The load pager entities.
            /// </summary>
            /// <param name="pageSize">
            /// The page size.
            /// </param>
            /// <param name="pageIndex">
            /// The page index.
            /// </param>
            /// <param name="total">
            /// The total.
            /// </param>
            /// <param name="whereLambda">
            /// The where lambda.
            /// </param>
            /// <param name="isAsc">
            /// The is asc.
            /// </param>
            /// <param name="orderByLambda">
            /// The order by lambda.
            /// </param>
            /// <typeparam name="TSource">
            /// </typeparam>
            /// <typeparam name="T">
            /// </typeparam>
            /// <returns>
            /// The <see cref="IQueryable"/>.
            /// </returns>
            public override IQueryable<T> LoadPagerEntities<TSource, T>(int pageSize, int pageIndex, out int total, Func<T, bool> whereLambda, bool isAsc, Func<T, TSource> orderByLambda)
            {
                var tempData = DBContext.Set<T>().Where<T>(whereLambda);
                total = tempData.Count();
    
                // 排序获取当前页的数据
                tempData = isAsc ? tempData.OrderBy(orderByLambda).Skip(pageSize * (pageIndex - 1)).Take(pageSize).AsQueryable() : tempData.OrderByDescending(orderByLambda).Skip(pageSize * (pageIndex - 1)).Take(pageSize).AsQueryable();
                return tempData.AsQueryable();
            }
        }

    下面附上测试代码

        /// <summary>
        /// The permission service.
        /// </summary>
        public class PermissionService
        {
            /*
             测试环境 需要在本地创建一个数据库  名称见app.config
             */
    
            /// <summary>
            /// 测试事务提交
            /// </summary>
            public static void AddTransactionScope()
            {
                User u = new User
                {
                    Id = Guid.NewGuid(),
                    DepartmentId = Guid.NewGuid(),
                    Email = "45514544@qq.com",
                    Enabled = true,
                    Mobile = "1254555555",
                    NickName = "小久",
                    Password = "sdsdsdsdsdsdsds",
                    UserName = "kokkskskdj",
                    RegisterDate = DateTime.Now,
                    Remark = string.Empty,
                    IsAdministrator = false,
                };
    
                Role r = new Role
                {
                    Name = "sdsd",
                    Id = Guid.NewGuid(),
                    Enabled = true,
                    ParentId = Guid.NewGuid(),
                    Remark = "sdsdsd"
                };
    
                UserRoleRelationship ur = new UserRoleRelationship
                {
                    Id = Guid.NewGuid(),
                    RoleId = r.Id,
                    UserId = u.Id
                };
    
                using (BaseRepository repository = PermissionService.Factory())
                {
                    using (TransactionScope trans = new TransactionScope())
                    {
                        try
                        {
                            repository.AddEntities(u);
                            repository.AddEntities(r);
                            repository.AddEntities(ur, true);
                            trans.Complete();
                        }
                        catch (Exception exception)
                        {
                            throw new Exception(exception.Message);
                        }
                        finally
                        {
                            trans.Dispose();
                        }
                    } 
                }
            }
    
            /// <summary>
            /// 测试链接数据库.
            /// </summary>
            public static void AddPermission()
            {
                Role r = new Role
                {
                    Name = "sdsd",
                    Id = Guid.NewGuid(),
                    Enabled = true,
                    ParentId = Guid.NewGuid(),
                    Remark = "sdsdsd"
                };
    
                // 一定要引用 EntityFramework跟EntityFramework.SqlServer 这个2个dll
                // 也可以直接使用当前上下文实现(不推荐此方法)
                using (PermissionEntities p = new PermissionEntities())
                {
                    p.Roles.Add(r);
                    p.SaveChanges();
                }
            }
    
            /// <summary>
            /// 测试查询
            /// </summary>
            public static void Query()
            {
                using (BaseRepository repository = PermissionService.Factory())
                {
                    var reulst = repository.LoadEntitiesM<Role>(role => role.Enabled);
                }
            }
    
            /// <summary>
            /// 工厂方法
            /// </summary>
            /// <returns>数据仓储</returns>
            public static BaseRepository Factory()
            {
                DbContext dbContext = new PermissionEntities();
    
                // 默认sqlserver仓储 也可以改用mysql仓储
                BaseRepository repository = new SqlRepository(dbContext);
                return repository;
            }
        }

    demo下载

  • 相关阅读:
    【HCIE-RS_TAC诊断5-2】
    【HCIE-RS_TAC诊断5-1】
    【HCIE-RS_TAC诊断4】
    【HCIE-RS_TAC诊断3】
    【HCIE-RS_TAC诊断2】
    华为ICT大赛辅导——双AC主备双链路备份
    shell 函数与内置变量
    CF505E Mr. Kitayuta vs. Bamboos
    CF559E Gerald and Path
    CF538H Summer Dichotomy
  • 原文地址:https://www.cnblogs.com/liuxiaoji/p/4585502.html
Copyright © 2020-2023  润新知