Asp.net mvc Web api未从EF 4.1 DbContext返回新添加的记录

Asp.net mvc Web api未从EF 4.1 DbContext返回新添加的记录,asp.net-mvc,entity-framework,asp.net-web-api,Asp.net Mvc,Entity Framework,Asp.net Web Api,我用VS2011创建了一个简单的asp.net MVC4/EF 4.1项目,其中一层用于我的域模型,另一层用于包含DbContext的数据库。我有一个名为Batch的基本域类和一个使用索引/创建/编辑操作的具有标准CRUD功能的BatchController。我使用重写的Seed方法添加了两条默认记录。所有这些都很好,我可以使用现成的MVC模板添加/编辑/删除记录: public class BatchController : Controller { private readonly

我用VS2011创建了一个简单的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);
    }
}
我在解决方案中添加了一个新的MVC4WebAPI项目,目的是公开域对象,以便通过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;
    }
}
公共类批处理控制器:ApiController
{
私有只读MyContext\u上下文;
公共批处理控制器()
{
_context=newmycontext();
}
//获取/api/批处理
公共IEnumerable Get()
{
var batches=_context.batches.ToList();
如果(批次==null)
抛出新的HttpResponseException(HttpStatusCode.NotFound);
退货批次;
}
//获取/api/batches/5
公共批处理获取(int-id)
{
var batch=\u context.Batches.Find(id);
如果(批==null)
抛出新的HttpResponseException(HttpStatusCode.NotFound);
退货批次;
}
}

我的问题是,当我添加一个新记录并试图通过浏览器检索它时,只返回使用Seed方法编辑的现有记录-我无法返回任何新添加的记录。DbContext似乎正在缓存初始记录,而不是去数据库获取最新记录……如何返回新添加的记录?

有一个答案,但它不能解决我的问题:

此外,这里还有一个相同的问题:

我觉得这很有用:

但关键是: 无法将代理对象发送到webapi序列化程序。因此,它应该被投影到一个新的动态类或一个没有虚拟类的预定义类(或者可能是IList、ICollection等)


为了澄清显而易见的问题,您肯定已经重新连接到WebAPI项目,指向同一个数据库,对吗?因为默认情况下,Web API将附加自己的SQL Compact DB。这意味着您可以有效地使用两个独立的数据库

它可能是一个浏览器缓存。我在WCF REST中注意到了这一点,IE比Chrome更糟糕。您可以删除浏览器缓存并重新运行吗?只是为了清除明显的问题,您肯定已经重新连接到Web API项目以指向同一个数据库,对吗?因为默认情况下,Web API将附加自己的SQL Compact DB。这意味着您可以有效地使用两个独立的数据库。我清除了缓存,但这导致它不返回任何记录(!)@JSancho I从global.asax中删除了该行,它在其中设置了自己的db。我使用的DbContext与主项目使用的DbContext相同:“\u context=new MyContext()”。我让它返回在Seed方法中创建的默认记录,因此我知道它指向同一个db。@JSANCO修复了您说的对的问题,它仍然使用自己的db…我已从global.asax文件中删除了实例化db的行,但连接字符串仍然在web.config文件中。用我正确的配置文件替换它。如果你想添加你的回答,我会给你完成!很高兴知道你成功了,伙计。谢谢你的反馈。
// GET api/ProfileGame
public dynamic GetProfileGames()
{
    return db.ProfileGames.Select(pg => new
    {
        ...
    }).AsEnumerable();
}