在上一篇文章中,我们已经搭建了整个芒果后台管理系统整个工程架构,并集成了AutoMapper,日志组件等,接下来我们将使用Entity Framework完善系统的持久化存储部分。这篇EF的构造,我将以一种快速集成的方式实现,并提供超多的Linq公共方法供业务使用。
Nuget引入EF
在XiaoMo.Repository工程里,右键工程使用Nuget引入EntityFramework ,这里我使用最新的6.4版本
在XiaoMo.Service的Web.config里,添加Sql Server连接字符串(AppSetting内)
<add key=\"conStr\" value=\"Server=10.60.215.202;Database=mango_sys;Persist Security Info=True;User ID=sa;Password=**\" />
创建表
创建表以及Entity
对应Entity
[Table(\"Orders\")]public class OrderInfoEntity{public int Id { get; set; }public DateTime OptTime { get; set; }public string Address { get; set; }public string Uuid { get; set; }public string AcceptUser { get; set; }public string TelephoneNumber { get; set; }public string ProductName { get; set; }public int Number { get; set; }public double Price { get; set; }public double Sum { get; set; }public string PackCompany { get; set; }public string PackNumber { get; set; }public string Status { get; set; }public string ExpressNumber { get; set; }}
EF关键配置
创建数据库交互上下文DatabaseContext.cs,初始化时指定连接。这里因为我们先用数据库表,所以我们使用Database.SetInitializer(null); 使用空策略初始化EF 。添加DBSet,用于操作表。
public class DatebaseContext : DbContext{static string ConnectionString = \"\";static DatebaseContext(){Database.SetInitializer<DatebaseContext>(null);}public DatebaseContext(string connStr): base(connStr){}public DatebaseContext(): base(GetConnectionString()){}private static string GetConnectionString(){if (string.IsNullOrEmpty(ConnectionString)){ConnectionString = ConfigurationManager.AppSettings[\"conStr\"].ToString();}return ConnectionString;}public virtual DbSet<OrderInfoEntity> Records { get; set; }public virtual DbSet<UsersEntity> User { get; set; }}
添加数据交互接口,这里只列出几个关键接口方法
public interface IRepository{}public interface IRepository<TEntity> : IRepository where TEntity : class
//methods
T Query<T>(Func<IQueryable<TEntity>, T> queryMethod);TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate);TEntity Load<TPrimaryKey>(TPrimaryKey id);bool Exist(Expression<Func<TEntity, bool>> predicte);TEntity Insert(TEntity entity);TEntity Update(TEntity entity);
创建RepositoryManager.cs,封装DatabaseContext,并实现CRUD
public class RepositoryManager : IDisposable
创建RepositoryEntityBase.cs,作为所有Dao层的公共基类,以供继承映射数据库实体。
public class RepositoryEntityBase<TEntity> : IRepository<TEntity> where TEntity : class
创建OrderDao
public class OrdersDao : RepositoryEntityBase<OrderInfoEntity>
这两个文件内容过多,我就不粘贴到这了。
业务访问持久化逻辑
列举几个使用集成好的EF框架交互的例子
1.查询当前用户是否为代理
public bool IsAgent(string username){using (var repMgr = new RepositoryManager()){return repMgr.Exist<UsersEntity>(u => u.UserName == username && u.Role == 1);}}
2.判断用户名密码是否正确
public string SearchUser(string username,string pwd){using (var repMgr = new RepositoryManager()){var queryuser = repMgr.FirstOrDefault<UsersEntity>(u => u.UserName == username && u.Password == pwd);}}
3.分页查询订单
public QueryResponse Query(QueryRequest request){using (var repMgr = new RepositoryManager()){var response = new QueryResponse();var query = repMgr.Query<OrderInfoEntity>();int count = query.Count();var results = query.OrderByDescending(s => s.OptTime).Skip((request.CurrentPage - 1) * request.PageSize).Take(request.PageSize);var entities = results.ToList();response.TotalCount = count;response.Result = entities.ConvertAll(Mapper.Map<OrderInfoEntity, OrderInfo>);return response;}}
4.创建订单
public OrderInfo CreateOrder(OrderInfo order){using (var repMgr = new RepositoryManager()){var entity = Mapper.Map<OrderInfo, OrderInfoEntity>(order);repMgr.Insert(entity);repMgr.Commit();order.Id = entity.Id;}}
整个数据库的查询和操作相当简单。这里您可能会问,如果有一些复杂的Sql语句,要怎么写,这里我们在RepositoryManager.cs里提供执行Sql语句的方法,只需要把sql与参数传递进来即可
public int ExecuteSqlCommand(string sql, params object[] args){return Context.Database.ExecuteSqlCommand(sql, args);}
如果有新的业务接入,那我们只需要在DatebaseContext中加入新的DBSet,创建对应Entity与表,其他不需要任何改动,整个EF的接入是超级便捷的。
结语
以上为大家实现系统集成EF的关键配置代码,由于篇幅较长,部分源码我并未粘贴全,大家如果感兴趣,可以私信小墨公众号,联系,下一节我们将继续芒果系统的快速搭建,IOC集成Castle。整个系列我将面向入门级新手,以实战干货角度为大家陆续呈现,之后将为大家呈现以.Net Core MVC姿势构建系列,希望大家支持。欢迎大家关注或搜索小墨公众号\”后端技术干货大全\”,私信作者,以获取更多小墨技术文章及程序人生!
感谢阅读!
感谢阅读!
本文由博客群发一文多发等运营工具平台 OpenWrite 发布
- 点赞
- 收藏
- 分享
- 文章举报
ron0625发布了8 篇原创文章 · 获赞 3 · 访问量 1350私信关注