一种ef与 unit of work+repository的简单用法

作者:陈重 分类:默认分类 时间:2014-11-08 17:52

1、建一套ef的code first的context和poco class

2、建 uow接口和repository接口

3、ef的context类实现uow接口,导向到ef本身的savechanges

4、uow获取rep的接口需要做 适配器 导向到dbset

5、建适配器,并导向到dbset

6、通过ioc获取uow,实际获得到的是ef的context

 using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace efIncludeRepository
{
    class Program     {
        static void Main(string[] args)
        {
            using (var db = new DBC())
            {
                var list = db.Father.Include(x => x.Children).ToList();
 
                var uow = db as IUOW;
                var rep = uow.GetRep<Father>();
 
                var xx = rep.Include(x => x.Children).ToList();
 
                Console.WriteLine("ok");
            }
        }
    }
 
    public interface IUOW     {
        int SaveChanges();
        IRep<T> GetRep<T>() where T : class;
    }
 
    public interface IRep<T> : IQueryable<T> where T : class     {
        T Add(T obj);
    }
 
    public class DBC : DbContext,IUOW     {
        public IDbSet<Father> Father { getset; }
        public IDbSet<Son> Son { getset; }
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Father>().HasKey(x => x.Id);
            modelBuilder.Entity<Father>()
                .Property(x => x.Id)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
 
            modelBuilder.Entity<Son>().HasKey(x => x.Id);
            modelBuilder.Entity<Son>()
                .Property(x => x.Id)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
 
            modelBuilder.Entity<Father>()
                .HasMany(x => x.Children)
                .WithRequired(x => x.Father)
                .HasForeignKey(x => x.Pid)
                .WillCascadeOnDelete();
 
            base.OnModelCreating(modelBuilder);
        }
 
        public IRep<T> GetRep<T>() where T : class         {
            return new Ada<T>(Set<T>());
        }
    }
 
    public class Ada<T> : IRep<T> where T : class     {
        public IDbSet<T> set;
 
        public Ada(IDbSet<T> set)
        {
            this.set = set;
        }
 
 
 
        public IEnumerator<T> GetEnumerator()
        {
            return set.GetEnumerator();
        }
 
        IEnumerator IEnumerable.GetEnumerator()
        {
            return set.GetEnumerator();
        }
 
        public Type ElementType
        {
            get { return set.ElementType; }
        }
 
        public Expression Expression
        {
            get { return set.Expression; }
        }
 
        public IQueryProvider Provider
        {
            get { return set.Provider; }
        }
 
        public T Add(T obj)
        {
            return set.Add(obj);
        }
    }
 
    public class Father     {
        public int Id { getset; }
        public string Name { getset; }
 
        public ICollection<Son> Children { getset; }
    }
 
    public class Son     {
        public int Id { getset; }
        public string Name { getset; }
 
        public int Pid { getset; }
        public Father Father { getset; }
    }
}
当前用户暂时关闭评论 或尚未登录,请先 登录注册
暂无留言
陈重推荐
版权所有:拓荒族 晋ICP备17002471号-6