我在这里写了一篇又长又详细的帖子,但我真诚地相信最好提前提供尽可能多的信息。如果需要进一步澄清,请询问。衷心感谢您阅读我的查询。
我正在使用 Adam Freeman 和 Steven Sanderson 所著的Pro ASP.NET MVC3 Framework一书(Apress,第三版),并从第 VII 章开始研究 Sports Store 示例。请注意,该项目需要通过使用 Ninject 来使用 DI,这是我想花时间进行本演练的主要原因。本教程中另一个令人印象深刻的贡献是,它向您展示了如何将 MVC 3 解决方案开发到单独的项目中,就像它在现实世界的实现中可能完成的那样——我发现几乎每一个项目都缺乏这一点。我看过的另一本书。(顺便说一句,我认为 Apress 的书籍几乎是最好的,一般来说。)
好的,所以我已经完成了第 7 章和第 8 章,这意味着我已经成功地创建和填充了一个数据库并检索了它的内容以显示在我的列表视图中。我还通过 .css 文件获得了格式。然而,这里有一个问题:当第一次经历这个时,我创建了IDE 本身的数据库,这没问题,因为只有一个小表(产品)需要担心。一切正常。但后来,出于我将很快说明的原因,我决定重新开始。这一次,我想完成相同的演练,但我将通过附加到现有的 .MDF 文件来访问数据,而不是在我对项目进行编码时从头开始创建新的数据库。所有这些都是为我在实际项目中使用类似模式铺平道路,我已经为此构建了一个复杂的数据库,其中充满了表、FK 关系、视图、函数和数据。我几乎不需要说我想在我的“真实”项目中使用我现有的数据库,因为从头开始重新创建所有这些几乎是不可能的。
好的,现在让我们回到 Sports Store 示例。尽我所能,我无法将数据从数据库获取到我的 UI 视图。在编译时或运行时没有错误消息,但在列表视图中看不到数据,我只看到一个空白页。请注意,在这种情况下,没有列标题或窗格是正确的,因为这里没有任何脚手架。
据我所知,我拥有我需要的所有零件。让我们从 Ninject 控制器工厂开始:
NinjectControllerFactory : DefaultControllerFactory
{
private IKernel ninjectKernel;
public NinjectControllerFactory()
{
ninjectKernel = new StandardKernel();
AddBindings();
}
protected override
IController GetControllerInstance
(RequestContext requestContext, Type controllerType)
{
return controllerType == null ? null
: (IController)ninjectKernel.Get(controllerType);
}
private void AddBindings()
{
//Had the mockup here before, which worked fine.
ninjectKernel.Bind<IProductRepository>().To<SportsStore2.Domain.Concrete.EFProductRepository>();
} ...
}
IProductRepository 如下:
namespace SportsStore2.Domain.Abstract
{
public interface IProductRepository
{
IQueryable<Product> Products { get; }
}
}
EFProductRepository 是这样实现的:
namespace SportsStore2.Domain.Concrete
{
public class EFProductRepository:IProductRepository
{
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products
{
get { return context.Products; }
}
}
}
为什么是的,当然定义了 EFDbContext;即声明:
namespace SportsStore2.Domain.Concrete
{
class EFDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
}
以及 Web.config 文件中的连接字符串;这应该将上下文对象定义与 .MDF 文件中的实际数据库连接起来,至少据我了解。
<connectionStrings>
<add name="EFDbContext"
connectionString="Data Source=Owner-PC\SQLEXPRESS;Initial Catalog = SportsStore20130205; Integrated security=SSPI"
providerName="System.Data.SqlClient" />
</connectionStrings>
最后,几乎可以肯定的是,我将 Product 控制器定义如下。我说“最少”是因为我几乎可以肯定问题不在这里。在调试模式下,我可以看出 productRepository 对象没有被填充。我可以在其中看到一些应该运行的 SQL 代码,或者此时已经运行。但是对 repository.Products 的调用什么也不返回。
命名空间 SportsStore2.WebUI.Controllers { 公共类 ProductController :控制器 { 私有 IProductRepository 存储库;
public ProductController(IProductRepository productRepository)
{
repository = productRepository;
}
public ViewResult List()
{
return View(repository.Products);
}
public ViewResult Count()
{
int counter = repository.Products.Count();
return View(repository.Products.Count());
}
}
}
namespace SportsStore2.WebUI.Controllers
{
public class ProductController : Controller
{
private IProductRepository repository;
public ProductController(IProductRepository productRepository)
{
repository = productRepository;
}
public ViewResult List()
{
return View(repository.Products);
}
}
}