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 { get; set; } public IDbSet<Son> Son { get; set; } 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 { get; set; } public string Name { get; set; } public ICollection<Son> Children { get; set; } } public class Son { public int Id { get; set; } public string Name { get; set; } public int Pid { get; set; } public Father Father { get; set; } } }