我有一个用VS 2011创建的简单的asp.net MVC4 / EF 4.1项目,我的域模型有一个层,而我的数据库有一个包含DbContext的层。我有一个名为Batch的基本域类和一个使用索引/创建/编辑操作的标准CRUD功能的BatchController。我用重写的Seed方法添加了两个默认记录。所有这一切都很好我可以使用开箱即用的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);
}
}
我在解决方案中添加了一个新的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 :(得分: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();
}
答案 1 :(得分:0)
为了清楚显而易见,您肯定已经重新连接到Web API项目以指向同一个数据库,对吧?因为默认情况下Web API会附加自己的SQL Compact DB。这意味着您可以有效地使用2个单独的数据库