0

我想要一个 ASP.NET MVC 网站,它有一些前端用于查看、添加和其他数据。然后我想要有 Web Api 来获取移动设备的数据等等。我想首先使用 EF 的代码(我正在使用 Ninject)。我为酒店和其他人创建课程。我创建了 HotelManagerContext 并创建了数据库并且看起来不错。为此,我正在通过 HomeController 和 Repository 添加数据。当我在 Visual Studio 中查看数据库时,数据就在那里。但是当我尝试将我的 HotelsController 用于 Api 时,数据上下文是空的。怎么了?我忘记设置什么?有连接字符串的东西还是什么?

这是我的 ApiController:

public class HotelsController : ApiController
{
    private IHotelRepository _hotelRepo { get; set; }

    public HotelsController(IHotelRepository repo)
    {
        _hotelRepo = repo;
    }

    // GET api/Hotels
    public IEnumerable<Hotel> GetHotels()
    {
        return _hotelRepo.GetAll();
    }

    // GET api/Hotels/5
    public Hotel Gethotel(int id)
    {
        return _hotelRepo.Get(id);
    }
}

这是我的前端控制器的一部分:

public class HomeController : Controller
{
    private IHotelRepository _hotelRepo { get; set; }

    public HomeController(IHotelRepository repo)
    {
        _hotelRepo = repo;
    }


    public ActionResult Index()
    {
        return View();
    }

    // next methods, for adding data and so
}

这是我的存储库:

public class HotelRepository : IHotelRepository
{
    private HotelManagerContext db { get; set; }

    public HotelRepository()
        :this (new HotelManagerContext())
    {
    }

    public HotelRepository(HotelManagerContext hotelManagerContext)
    {
        // TODO: Complete member initialization
        this.db = hotelManagerContext;
    }

    public Models.Hotel Get(int id)
    {
        return db.hotels.SingleOrDefault(h => h.hotId == id);
    }

    public IQueryable<Models.Hotel> GetAll()
    {
        return db.hotels;
    }


    public Hotel Add(Hotel hotel)
    {
        db.hotels.Add(hotel);
        db.SaveChanges();
        return hotel;
    }
}

这是我的 HotelManagerContext:

public class HotelManagerContext : DbContext
{
    public HotelManagerContext() : base("name=HotelManagerContext")
    {
    }

    public DbSet<Hotel> hotels { get; set; }
}

编辑:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IHotelRepository>().To<HotelRepository>();
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
    }    

Edit2: 这是我的连接字符串:

<add name="HotelManagerContext" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=HotelManagerContext-20121219191411; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|HotelManagerContext-20121219191411.mdf" providerName="System.Data.SqlClient" />

而且我刚刚发现即使在 HomeController 中我也有空的数据上下文。因此,当我在服务器资源管理器中检查数据库内容时,我添加了一些数据(在 HomeController 中)。但是每次当我有请求页面(web api 或前端)时,datacontext 都是空的,我可以添加从零开始计数的项目,但在数据库中已经有下一个但无法获取。这真的很奇怪。

4

2 回答 2

0

您的连接字符串是什么样的?“name=HotelManagerContext”似乎不完整。我认为您至少还想明确指定 providerName="System.Data.EntityClient" (请参见此处)。在任何情况下,通常的做法是将连接字符串放在 Web.Config 文件中并在那里分配名称(即 name="HotelMamangerContext"),然后,在正常情况下,EF 只会按照约定发现连接字符串,只要您的 DbContext 类的名称与 Web.Config 中的连接字符串的名称匹配(否则您仍然可以在构造函数中显式指定它)。

另一方面(我认为这与您当前的问题无关),您也可以考虑注入 DbContext 。然后,您可以在存储库类中删除无参数构造函数,除非您出于其他原因(例如单元测试)需要保留它。此外,如果您使用的是 Ninject.Web.Common,您可能需要考虑将实例范围限定为请求级别(请参阅InRequestScope)。

 ...
 kernel.Bind<HotelMamangerContext>().ToSelf().InRequestScope();
 kernel.Bind<IHotelRepository>().To<HotelRepository>().InRequestScope();
 ...
于 2013-01-17T19:54:40.627 回答
0

我找不到解决方案,所以我创建了新项目,并做了所有问题。我有相同的课程,复制并粘贴问题中的代码。我找不到任何重要的区别,但它第二次起作用了。

我知道这并不完全是解决方案,但在这种情况下,我可以从乞讨开始我的项目,所以我尝试了它,它真的很有帮助。就是不知道哪里出了问题。

于 2013-01-21T12:40:05.793 回答