Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# \webapi与前端数据库_C#_Asp.net Mvc_Database_Repository_Asp.net Web Api - Fatal编程技术网

C# \webapi与前端数据库

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时,它是空的。

我想有一个ASP.NETMVC网站,将有一些前端的数据查看,添加和其他事情。然后我想有一个Web Api来获取移动设备的数据等等。我想先使用EF中的代码(我正在使用Ninject)。我为酒店和其他人创建课程。我创建了HotelManagerContext,创建了数据库,看起来不错。我正在按HomeController和存储库为此添加数据。当我在VisualStudio中查看数据库时,数据是存在的。但当我尝试使用HotelsController for Api datacontext时,它是空的。发生了什么?我忘了设置什么?连接字符串还是什么

这是我的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 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();
 ...