2017-10-08 121 views
0

我目前正在学习接口和存储库模式,并且遇到困难。我有域类 “VehicleMake”无法使用存储库模式从数据库检索数据

public class VehicleMake 
{ 
    public VehicleMake() 
    { 

    } 

    [Key] 
    [Column(Order = 1)] 
    public int Id { get; set; } 

    [Required] 
    [StringLength(50)] 
    public string Name { get; set; } 

    public virtual ICollection<VehicleModel> VehicleModels { get; set; } 
} 

我也有一个接口 “IVehicleRepository”

public interface IVehicleRepository 
{ 
    IEnumerable<VehicleMake> All { get; } 
} 

和类 “VehicleRepository”,它实现该接口

public class VehicleRepository : IVehicleRepository 
{ 
    private readonly VehicleDbContext _context; 

    public VehicleRepository(VehicleDbContext context) 
    { 
     _context = context; 
    } 

    public IEnumerable<VehicleMake> All => _context.VehicleMakes; 
} 

我的DbContext类以下

public class VehicleDbContext : DbContext 
{ 
    public VehicleDbContext() : base("VehicleDbContext") 
    { 

    } 

    public DbSet<VehicleMake> VehicleMakes { get; set; } 
    public DbSet<VehicleModel> VehicleModels { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

    } 

} 

而我的“VehicleController”是继

public class VehicleController : Controller 
{ 
    private readonly IVehicleRepository _vehicleRepository; 

    public VehicleController() 
    { 

    } 

    public VehicleController(IVehicleRepository vehicleRepository) 
    { 
     _vehicleRepository = vehicleRepository; 
    } 

    // GET: VehicleMakes 
    public ActionResult Index() 
    { 
     return View(_vehicleRepository.All); 
    } 
} 

所以问题是,当我试图在我的控制器中检索“车辆进行”,我得到空引用例外,我不知道为什么。我是否正确实施了这个?如果没有,那么做到这一点的正确方法是什么?

+0

在VehicleController删除参数的构造函数,并请有一个测试 –

+0

当我删除它,我得到以下错误:“System.MissingMethodException:没有为此对象定义的无参数构造函数。” – iantukic

+0

发布了一个答案,以使您的代码正常工作。请看一看。 –

回答

0

你得到NullReferenceException,因为它调用你的无参数构造函数,你没有_ vehicleRepository字段的初始化。你的初始化是在构造函数中你传递对象的地方。

我相信,你没有依赖注入框架注册正确获取实例。所以,你可以简单地初始化_ vehicleRepository在默认的构造函数:

public class VehicleController : Controller 
{ 
    private readonly IVehicleRepository _vehicleRepository; 

    public VehicleController() 
    { 
       _vehicleRepository = new VehicleRepository(); 
    } 

    // GET: VehicleMakes 
    public ActionResult Index() 
    { 
      return View(_vehicleRepository.All); 
    } 
} 

更改VehicleRepository支持默认的构造函数在下列方式:

public class VehicleRepository : IVehicleRepository 
{ 
    private readonly VehicleDbContext _context; 
    public VehicleRepository() : this(new VehicleDbContext()) 
    { 
    } 
    public VehicleRepository(VehicleDbContext context) 
    { 
     _context = context; 
    } 

    public IEnumerable<VehicleMake> All => _context.VehicleMakes; 
}