把ORM封装成一个类(linq to entity)
很多人使用ORM层都是针对每个数据库表建立相应的类,导致工作量很大,代码重复很多。下面给大家介绍使用linq to entity封装一个公用的ORM类。
首先声明一个接口:
using System; using System.Collections.Generic; namespace Demode.Repository { public interface IDBRepository<TEntity> : IDisposable where TEntity : class { System.Data.Objects.ObjectSet<TEntity> DataSource { get; } void Save(IEnumerable<TEntity> entitys); void Delete(TEntity entity); void Insert(TEntity entity); void Save(TEntity entity); System.Collections.Generic.IList<TEntity> Select(int start, int limit); void SaveChanges(); } }
主类代码实现接口:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Demode.Repository { public class SQLProxy<TEntity> : Demode.Repository.IDBRepository<TEntity> where TEntity : class { public System.Data.Objects.ObjectSet<TEntity> DataSource { get { return this.Context.CreateObjectSet<TEntity>(); } } protected Models.loginDemodeEntities Context { get; set; } internal SQLProxy(Models.loginDemodeEntities context) { this.Context = context; } public IList<TEntity> Select(int start, int limit) { return this.DataSource.Skip(start).Take(limit).ToList(); } public void Insert(TEntity entity) { this.DataSource.AddObject(entity); } public void Delete(TEntity entity) { //this.Attach(entity); dynamic temp = entity; temp.Flag = false; } public void Save(IEnumerable<TEntity> entitys) { foreach (var i in entitys) this.Save(i); } public void Save(TEntity entity) { this.Attach(entity); } protected void Attach(TEntity entity) { this.DataSource.Attach(entity); this.Context.Refresh(System.Data.Objects.RefreshMode.ClientWins, entity); } public void SaveChanges() { this.Context.SaveChanges(); } public void Dispose() { this.Context.Dispose(); } } }
最后创建一个工厂类减少耦合:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Demode.Repository { public class DBFactory { public static IDBRepository<TEntity> Create<TEntity>() where TEntity : class { IDBRepository<TEntity> db = new SQLProxy<TEntity>(new Models.loginDemodeEntities()); return db; } } }
到了这里ORM代码就写完了,需要操作哪个表,只要传人相应的对象就可以了,是不是很简单!
下面是一个使用的实例:
Repository.IDBRepository<Models.User> a = Repository.DBFactory.Create<Models.User>(); //使用工厂类,声明一个对象 Models.User use = new Models.User(); use.use_account = userName; use.use_password = password; a.Insert(use); //调用封装好类的方法 a.SaveChanges(); //调用封装好类的方法
return Request.CreateResponse(HttpStatusCode.BadRequest);
注:其实只要一个主类就可以实现了,增加其他类是为了减少耦合!