Breeze.js在保存期间出错

时间:2012-12-24 05:46:35

标签: breeze

保存数据时出现以下错误,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)"
}

5 个答案:

答案 0 :(得分:2)

2013年10月28日更新:

截至目前,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)

ckal所述,您必须更新EFContextProvider.cs并使用Entity Framework 6中的新命名空间。

以下是包含更新代码的gist。您必须更新到Breeze.WebApi项目中的Entity Framework 6才能使其正常工作。

我已经在自己的项目中测试了它,它似乎和以前一样工作。