1

VS 2011 で作成された単純な asp.net MVC4 / EF 4.1 プロジェクトがあり、ドメイン モデル用のレイヤーと、DbContext を含むデータベース用のレイヤーがあります。Batch と呼ばれる 1 つの基本的なドメイン クラスと、Index / Create / Edit アクションを使用する標準の CRUD 機能を備えた BatchController があります。オーバーライドされた Seed メソッドを使用して、2 つの既定のレコードを追加します。これはすべて正常に機能し、すぐに使用できる MVC テンプレートを使用してレコードを追加/編集/削除できます。

public class BatchController : Controller
{
    private readonly MyContext _context = new MyContext();

    public ActionResult Index()
    {
        return View(_context.Batches.ToList());
    }

    [HttpPost]
    public ActionResult Create(Batch batch)
    {
        if (ModelState.IsValid)
        {
            this._context.Batches.Add(batch);
            this._context.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(batch);
    }
}

json 経由でデータを取得できるように、ドメイン オブジェクトを公開する目的で、新しい MVC4 Web API プロジェクトをソリューションに追加しました。これは、BatchesController と呼ばれる API コントローラーを使用し、ドメインとデータベース レイヤーへの参照を追加しました。Get() メソッドが 2 つあります。1 つはすべてのバッチを返し、もう 1 つは ID を指定して 1 つのバッチを返します。メインの MVC アプリと Web API をホストするために IIS Express を使用しています。すべてのバッチを取得するには、ブラウザーでこれを実行します。

http://localhost:46395/api/batches

これが私のWeb APIコントローラーです:

public class BatchesController : ApiController
{
    private readonly MyContext _context;

    public BatchesController()
    {
        _context = new MyContext();
    }

    // GET /api/batches
    public IEnumerable<Batch> Get()
    {
        var batches = _context.Batches.ToList();

        if (batches == null)
            throw new HttpResponseException(HttpStatusCode.NotFound);

        return batches;
    }

    // GET /api/batches/5
    public Batch Get(int id)
    {
        var batch = _context.Batches.Find(id);

        if (batch == null)
            throw new HttpResponseException(HttpStatusCode.NotFound);

        return batch;
    }
}

私の問題は、新しいレコードを追加してブラウザ経由で取得しようとすると、シード メソッドで追加された既存のレコードのみが返されることです。新しく追加されたレコードが返されません。DbContext は最初のレコードをキャッシュしているようで、最新のレコードを取得するためにデータベースにアクセスしていないようです...新しく追加されたレコードを返すにはどうすればよいですか?

4

2 に答える 2

0

明らかなことを明確にするために、同じデータベースを指すように Web API プロジェクトに配線し直したはずですよね? デフォルトでは、Web API は独自の SQL Compact DB をアタッチするためです。2 つの別々のデータベースを効果的に使用できることを意味します

于 2012-06-17T13:41:47.613 に答える
0

私の問題を解決しない答えがあります: http://www.strathweb.com/2012/03/serializing-entity-framework-objects-to-json-in-asp-net-web-api/

また、ここにも同じ質問があります: http://forums.asp.net/t/1814377.aspx/1?Web+api+not+returning+records+from+EF+4+1+DbContext

そして、これは便利だと思います: ASP.Net Web APIはVSで正しく表示されますが、HTTP500を提供します

しかしポイントは: プロキシ オブジェクトを webapi シリアライザーに送信することはできません。したがって、新しい動的クラスまたは仮想がない事前定義されたクラス (または IList、ICollection など) にプロジェクトする必要があります。

// GET api/ProfileGame
public dynamic GetProfileGames()
{
    return db.ProfileGames.Select(pg => new
    {
        ...
    }).AsEnumerable();
}
于 2012-06-16T06:18:06.130 に答える