1

我有一个使用 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 似乎正在缓存初始记录,而不是去数据库获取最新的......我如何返回新添加的记录?

4

2 回答 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 在 VS 中正确显示但给出 HTTP500

但重点是:您不能将代理对象发送到 webapi 序列化程序。所以它应该是一个新的动态类或一个没有虚拟的预定义类(或者可能是 IList,ICollection,...)。

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

只是为了澄清这一点,您肯定已经重新连接到 Web API 项目以指向同一个数据库,对吧?因为默认情况下 Web API 会附加它自己的 SQL Compact DB。这意味着您可以有效地使用 2 个独立的数据库

于 2012-06-17T13:41:47.613 回答