保存数据时出现以下错误,Get工作正常。
我正在使用VS2012,创建MVC4 Webapi项目,使用Nuget
获取Breeze.js
。
在服务器上我使用的是Code First中的DbContext。
服务器端代码
[BreezeController]
public class CountryController : ApiController
{
private CountryContext db = new CountryContext();
readonly EFContextProvider<CountryContext> _contextProvider =
new EFContextProvider<CountryContext>();
// ~/api/todos/Metadata
[HttpGet]
public string Metadata()
{
return _contextProvider.Metadata();
}
// GET api/Country
public IQueryable<Country> GetCountries()
{
return db.Countries.AsQueryable();
}
// ~/api/todos/SaveChanges
[AcceptVerbs("POST")]
public SaveResult SaveChanges(JObject saveBundle)
{
return _contextProvider.SaveChanges(saveBundle);
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
}
}
DbContext
public class CountryContext : DbContext
{
public CountryContext() : base("name=CountryContext")
{
}
public DbSet<Country> Countries { get; set; }
}
标题
{
"entities":[
{
"Country_ID":1,
"Country_Code":"USA modified",
"Country_Name":"Unites states hjk",
"entityAspect":{
"entityTypeName":"Country:#LearnKnockout.Models",
"entityState":"Modified",
"originalValuesMap":{
"Country_Name":"Unites states"
},
"autoGeneratedKey":{
"propertyName":"Country_ID",
"autoGeneratedKeyType":"Identity"
}
}
}
],
"saveOptions":{
"allowConcurrentSaves":false
}
}
响应
{
"$id":"1",
"$type":"System.Web.Http.HttpError, System.Web.Http",
"Message":"An error has occurred.",
"ExceptionMessage":"Method not found: 'System.Data.Objects.ObjectContext System.Data.Entity.Infrastructure.IObjectContextAdapter.get_ObjectContext()'.",
"ExceptionType":"System.MissingMethodException",
"StackTrace":" at Breeze.WebApi.EFContextProvider 1.get_ObjectContext()\r\n at Breeze.WebApi.EFContextProvider 1.ProcessSaves(Dictionary2 saveMap)\r\n at Breeze.WebApi.EFContextProvider 1.SaveChangesCore(Dictionary2 saveMap)\r\n at Breeze.WebApi.ContextProvider.SaveChanges(JObject saveBundle)\r\n at LearnKnockout.Controllers.CountryController.SaveChanges(JObject saveBundle) in c:\\Users\\nssidhu\\Documents\\Visual Studio 2012\\Projects\\CountryWebAPI\\CountryWebAPI\\Controllers\\CountryController.cs:line 43\r\n at lambda_method(Closure , Object , Object[] )\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass13.b__c(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.<>c__DisplayClass5.b__4()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func 1 func, CancellationToken cancellationToken)"
}
答案 0 :(得分:2)
截至目前,Breeze 1.4.5支持Microsoft的ASP.NET WebApi 2和Entity Framework 6.请参阅http://www.breezejs.com/documentation/download。
我们尚未使用实体框架版本6 alpha 测试Breeze,并且可能不会这样做,直到它至少达到 beta < / EM> 即可。
也就是说,JasonFormatter和ODataActionFilter属性仍然存在于BreezeController属性的最新版本的breeze中。
答案 1 :(得分:2)
我猜你是怎么陷入这个烂摊子的。
首先,我打赌你在Visual Studio中使用可视化的“管理NuGet包”对话框。
其次,我敢打赌你在左上方的组合框中选择了“包含预先发布”。这是我可以重现您的体验的唯一方式。你能检查一下这个组合框设置并在这里给我们评论吗?
如果是这样,如果EF尚未在项目中,NuGet将安装EF v.6 alpha,如果是,则将EF 5升级到EF 6。 哎哟!如果您单独升级现有项目的EF包,也会发生这种情况。
我强烈建议大家坚持使用“仅稳定”设置,除非您完全确定需要预发行套餐;然后请记得将它设置回“仅稳定”,因为组合框设置是“粘性的”。
是的,我们可以限制我们的NuGet包中的EF版本的上限...也许我们会。坦率地说,这是contrary to the NuGet guidance,管理所有版本化排列非常困难,在偏离标准路径时承担责任非常重要。
我不清楚您是如何获得缺少 BreezeControllerAttribute 的 Breeze.WebApi.dll 的旧版本。除了安装 Breeze.MVC4WebApiClientSample NuGet包之外,您是如何了解 [BreezeController] 属性的?这是唯一可以找到该属性的NuGet包...并且安装(或升级到)该包应该已经向伴随的“packages”文件夹提供了正确的Breeze.WebApi.dll引用。
我怀疑你的项目文件有点像残骸。 你在NuGet地狱,除非你真的非常了解NuGet,否则你最好从头开始重建项目,复制自定义代码。
答案 2 :(得分:1)
由于EF 6.0中的命名空间更改,抛出了缺少的方法异常。特别是这些:
System.Data.Objects.ObjectContext =&gt; System.Data.Entity.Core.Objects.ObjectContext System.Data.EntityState =&gt; System.Data.Entity.EntityState
更多信息:http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6
您可以获取源并修改EFContextProvider.cs以使用这些名称空间。
答案 3 :(得分:0)
似乎最新的Nuget Packagae存在问题(主要是实体FramewroK的alpha版本)。
我卸载了当前的BreezeNuget Package,然后安装了早期版本,一切正常(使用旧版本我必须将属性更改为Jsonformater,oDataActionfilter而不是Breezecontroller)
Install-Package Breeze.MVC4WebApi -Version 0.78.1
答案 4 :(得分:0)