C# \webapi与前端数据库
我想有一个ASP.NETMVC网站,将有一些前端的数据查看,添加和其他事情。然后我想有一个Web Api来获取移动设备的数据等等。我想先使用EF中的代码(我正在使用Ninject)。我为酒店和其他人创建课程。我创建了HotelManagerContext,创建了数据库,看起来不错。我正在按HomeController和存储库为此添加数据。当我在VisualStudio中查看数据库时,数据是存在的。但当我尝试使用HotelsController for Api datacontext时,它是空的。发生了什么?我忘了设置什么?连接字符串还是什么 这是我的ApiController:C# \webapi与前端数据库,c#,asp.net-mvc,database,repository,asp.net-web-api,C#,Asp.net Mvc,Database,Repository,Asp.net Web Api,我想有一个ASP.NETMVC网站,将有一些前端的数据查看,添加和其他事情。然后我想有一个Web Api来获取移动设备的数据等等。我想先使用EF中的代码(我正在使用Ninject)。我为酒店和其他人创建课程。我创建了HotelManagerContext,创建了数据库,看起来不错。我正在按HomeController和存储库为此添加数据。当我在VisualStudio中查看数据库时,数据是存在的。但当我尝试使用HotelsController for Api datacontext时,它是空的。
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 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;
}
}
公共级酒店存储库:IHotelRepository
{
私有HotelManagerContext数据库{get;set;}
公共酒店
:此(新HotelManagerContext())
{
}
公共酒店存储库(HotelManagerContext HotelManagerContext)
{
//TODO:完成成员初始化
this.db=hotelManagerContext;
}
公共模型。酒店获取(int id)
{
返回db.hotels.SingleOrDefault(h=>h.hotId==id);
}
公共IQueryable GetAll()
{
返回酒店;
}
公共酒店地址(酒店)
{
db.hotels.Add(酒店);
db.SaveChanges();
返回酒店;
}
}
这是我的HotelManagerContext:
public class HotelManagerContext : DbContext
{
public HotelManagerContext() : base("name=HotelManagerContext")
{
}
public DbSet<Hotel> hotels { get; set; }
}
公共类HotelManagerContext:DbContext
{
public HotelManagerContext():base(“name=HotelManagerContext”)
{
}
公共星展酒店{get;set;}
}
编辑:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IHotelRepository>().To<HotelRepository>();
GlobalConfiguration.Configuration.DependencyResolver = new NinjectResolver(kernel);
}
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
GlobalConfiguration.Configuration.DependencyResolver=新的NinjectResolver(内核);
}
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中,我也有空的datacontext。所以,当我在服务器资源管理器中检查数据库内容时,我添加了一些数据(在HomeController中)。但每当我有请求页面(web api或前端)时,datacontext都是空的,我可以添加项目,从零开始计数,但在数据库中已经有下一个,但无法获取它。这真的很奇怪。你的连接字符串是什么样子的?“name=HotelManagerContext”似乎不完整。我认为您至少也应该明确指定providerName=“System.Data.EntityClient”(请参阅)。在任何情况下,通常的做法是将连接字符串放在Web.Config文件中并在其中指定名称(即name=“HotelMamangerContext”),然后,在正常情况下,只要DbContext类的名称与Web.Config中的连接字符串的名称匹配,EF就会按照约定查找连接字符串(否则,您仍然可以在构造函数中显式指定它) 另一方面(我认为这与您当前的问题无关)然后,您可以考虑将DbContext注入到您的存储库类中,除非您需要将其保留在另一个原因中,例如单元测试。如果您使用Ninject.Web.Common,那么您可能需要考虑将实例范围化为请求级别(参见)。
。。。
kernel.Bind().ToSelf().InRequestScope();
kernel.Bind().To().InRequestScope();
...
我找不到解决方案,所以我创建了一个新项目,我做了问题中的所有事情。我有相同的类,从问题中复制和粘贴代码。我找不到任何重要的区别,但第二次它起作用了
我知道这不完全是解决方案,但在这种情况下,我可以从乞讨开始我的项目,所以我尝试了它,它真的很有帮助。只是不知道问题出在哪里。您的IHotelRepository是否按应有的方式注入?HotelRepository.db是否是对象(非空)?任何错误/异常?我添加了RegisterServices。我认为我做得对。我没有收到任何错误或异常,我不确定您的意思:“HotelRepository.db是对象(非空)”吗。当您调试ApicController时,您能确认DataContext为空吗?是的,它显示为零计数。我从Web.Config发布了连接字符串,并编辑了我的问题。问题出在哪里可能会有帮助。我在数据库中有数据,但在DataContext中它为空,这真的很奇怪。我在RequestScope中尝试过,但没有帮助。您尝试过吗d简单地去掉:base(“name=HotelManagerContext”)?正如我提到的,EF无论如何都应该找到您的连接字符串,因为它的名称与您的DbContext类名匹配(约定)。是的,我已经尝试过了。我尝试过只删除字符串“name…”然后所有这些都是相同的结果。我在Debbug时查看了datacontext,在Connection属性中得到了这个属性:
“数据源=(localdb)\\v11.0;AttachDbFilename=| DataDirectory | HotelManagerContext-20121219191411.mdf;Initial Catalog=HotelManagerContext-20121219191411;integratedsecurity=True;MultipleActiveResultSets=True;Application Name=EntityFrameworkMUE“
。我觉得没问题。
<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" />
...
kernel.Bind<HotelMamangerContext>().ToSelf().InRequestScope();
kernel.Bind<IHotelRepository>().To<HotelRepository>().InRequestScope();
...