【问题标题】:Abstracting ef core 2 dbContext抽象 ef core 2 dbContext
【发布时间】:2018-05-04 11:47:28
【问题描述】:

我正在尝试对我的数据库上下文层进行抽象(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 core 2 CarContext以便使用dbContext保存

我尝试制作一个由CarContext 实现的接口IDbContext 但那样我就不能使用dbContext.Cars.Insert,因为我没有实现 dbContext cars 集合无权访问 ef 核心方法和属性。

我当然可以使用具体的实现,但我正在尝试进行抽象,以便我可以使用单元测试,...

你会怎么做?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • "EF Core 100% 易于测试。"我不能同意。我无法模拟 SaveChange 返回的内容。此外,如果您使用 ExecuteSqlCommand,您的测试将崩溃,因为 UseInMemoryDatabase 不支持它:“关系特定的方法只能在上下文使用关系数据库提供程序时使用”。
    • SaveChanges 返回受影响的记录数。你怎么不能模拟返回一个int?其次,使用内存数据库不会是模拟。如果你实际上模拟了上下文,你可以存根ExecuteSqlCommand 做任何你想做的事情。您不了解如何正确测试并不是 EF Core 的不足。
    猜你喜欢
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多