2012-06-13 67 views
1

我有一個簡單的asp.net MVC4/EF 4.1項目用VS 2011創建,一個圖層用於我的域模型,另一個用於我的數據庫包含DbContext。我有一個名爲Batch的基本域類和一個帶有使用索引/創建/編輯操作的標準CRUD功能的BatchController。我用重寫的Seed方法添加兩個默認記錄。這一切工作正常,我可以使用開箱MVC模板的添加/編輯/刪除記錄:Web api不返回新添加的記錄從EF 4.1 DbContext

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); 
    } 
} 

我添加了一個新的MVC4的Web API項目的解決方案與暴露的域對象,因此數據的意圖可以通過json獲取。這使用了我稱之爲BatchesController的api控制器,並且添加了對我的域和數據庫層的引用。我有兩個Get()方法,一個返回所有批次,另一個返回給定ID的單個批次。我使用IIS Express來託管主MVC應用程序和Web API。要檢索所有批次我在瀏覽器中運行這個命令:

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; 
    } 
} 

我的問題是,當我添加一個新的記錄,並嘗試通過瀏覽器進行檢索,只有使用Seed方法返回的現有記錄纔會返回 - 我無法獲取任何新添加的記錄來返回。 DbContext似乎是緩存最初的記錄,而不是去數據庫獲取最新的...我如何返回新添加的記錄?

+0

它可能是瀏覽器緩存。我注意到這與WCF REST,IE瀏覽器比Chrome更糟糕。你可以刪除瀏覽器緩存並重新運行? –

+0

只是爲了清楚顯而易見,您已經重新將Web API項目重新連接到指向同一個數據庫,對吧? 因爲默認情況下,Web API將附加自己的SQL Compact DB。 這意味着你可以有效地使用2個獨立的數據庫。 – JSancho

+0

我清除了緩存但導致它不返回任何記錄(!)。 @JSancho我從global.asax中刪除了它設置自己的數據庫的行。我正在使用主項目使用的相同DbContext:「_context = new MyContext()」。我得到它返回在Seed方法中創建的默認記錄,所以我知道它指向相同的數據庫。 –

回答

0

只是爲了清楚顯而易見的是,您肯定重新將Web API項目重新連接到指向同一個數據庫,對吧?因爲默認情況下,Web API將附加自己的SQL Compact DB。這意味着你可以有效地使用2個獨立的數據庫

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 showing correctly in VS but giving HTTP500

但是要點是: 您無法將代理對象發送到webapi序列化程序。所以它應該投影到一個新的動態類或預定義的類,它不存在虛擬的(或者可能是IList,ICollection,...)。

// GET api/ProfileGame 
public dynamic GetProfileGames() 
{ 
    return db.ProfileGames.Select(pg => new 
    { 
     ... 
    }).AsEnumerable(); 
}