摘要ef core 2 dbContext

时间:2018-05-04 11:47:29

标签: entity-framework .net-core entity-framework-core asp.net-core-2.0

我试图对我的数据库上下文层进行抽象(EntityFramework 2.0)。

Car.DataContext
 ------------------- 
 public abstract class BaseCarContext : DbContext
    {
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Car>(e =>
            {
                e.ToTable("Car");             
            });
            modelBuilder.Entity<Car>(e => { e.ToTable("Cars"); });
        }
    }

     public class CarContext : BaseCarContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (optionsBuilder.IsConfigured)
                return;

            optionsBuilder.UseSqlServer(@"Server = xxxx; Database = xxxx; Trusted_Connection = True;");
        }

        public DbSet<Car> Cars { get; set; }        
    }

 Car.Logic
 ----------------
 public interface ICarService
 {
    GetCarResponse RetrieveCar(int id);
    void Save(int id);
    ...
 }

 public class CarService : ICarService
 {
    private readonly ICarService service;   
    // dbContext interface

    public CarService(ICarService service){
        this.service = service; 
        // injecting db context interface
    }

    public void Save(int id){
        ... saving using injected db context
        // injected db context.Insert(new Car{ Name = "Honda" });
    }
    ...
 }

我如何抽象此ef核心2 CarContext以便使用dbContext保存

我尝试制作一个由IDbContext实现的界面CarContext  但是这样我就不能使用dbContext.Cars.Insert,因为我没有实现dbContext汽车集合,也无法访问ef核心方法和属性。

我当然可以使用具体的实现,但是我试图进行抽象,所以我可以使用单元测试,......

你会怎么做?

1 个答案:

答案 0 :(得分:1)

首先,您不需要对单元测试进行抽象。 EF Core 100%测试友好。其次,在我看来,EF(或者实际上任何 ORM)中唯一真正可接受的抽象是微服务或CQRS /事件源模式。这些实际上增加了价值,因为它们要么完全抽象依赖关系和/或解决实际的业务线问题。但是,这些模式还需要大量的工作才能正确实现,因此通常保留用于大型复杂应用程序。

长短,只要直接使用EF,除非你有充分的理由不这样做。测试不是一个好理由。