0

データを調べたり、追加したり、その他のことを行うためのフロントエンドを持つASP.NET MVC Webサイトが必要です。そして、モバイル デバイスなどのデータを取得するための Web Api が必要です。最初に EF からコードを使用したい (そして、Ninject を使用しています)。ホテルなどのクラスを作成しています。HotelManagerContext を作成し、データベースが作成され、見栄えがよくなりました。このために、HomeController と Repository によってデータを追加しています。Visual Studio でデータベースを見ると、そこにデータがあります。しかし、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 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

これに対する解決策が見つからないので、新しいプロジェクトを作成し、質問のようにすべてを行いました。同じクラスがあり、質問からコードをコピーして貼り付けます。重要な違いは見つかりませんが、2回目は機能しています。

これが正確な解決策ではないことはわかっていますが、この場合、プロジェクトを物乞いから始めることができたので、試してみましたが、本当に役に立ちました。どこに問題があるのか​​わからないだけです。

于 2013-01-21T12:40:05.793 に答える