【问题标题】:Breeze.js Getting Error during SaveBreeze.js 在保存期间出现错误
【发布时间】:2013-10-29 07:15:33
【问题描述】:

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

【问题讨论】:

  • 您是使用代码优先还是数据库优先 EF?如果首先使用数据库,您是在 EFContextProvider 中使用 DbContext 实例还是 ObjectContext 实例?
  • 你到底想要什么?除了堆栈跟踪之外,您没有问任何问题更多信息会有所帮助...
  • 在服务器上,你的 DbContext 或 ObjectContext 是什么样的,你使用的是什么版本的实体框架?
  • 我发现 Todo 示例中也出现完全相同的错误,我也使用 nuget 下载到示例

标签: breeze


【解决方案1】:

我猜你是怎么陷入这个烂摊子的。

首先,我打赌您正在使用 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 包......并且安装(或升级到)该包应该已将正确的 Breeze.WebApi.dll 引用传递给配套的“包”文件夹。

我怀疑您的项目文件有点混乱。 你陷入了 NuGet 地狱,除非你真的很了解 NuGet,否则最好从头开始重新构建项目,复制你的自定义代码。

【讨论】:

【解决方案2】:

2013 年 10 月 28 日更新:

截至目前,Breeze 1.4.5 已支持 Microsoft 的 ASP.NET WebApi 2 和 Entity Framework 6。请参阅http://www.breezejs.com/documentation/download

旧帖...

我们尚未使用 Entity Framework 版本 6 alpha 测试 Breeze,并且在它至少达到 beta

也就是说,JsonFormatter 和 ODataActionFilter 属性与 BreezeController 属性一起仍然存在于最新版本的微风中。

【讨论】:

    【解决方案3】:

    由于 EF 6.0 中的命名空间更改而引发缺少方法异常。具体如下:

    System.Data.Objects.ObjectContext => System.Data.Entity.Core.Objects.ObjectContext System.Data.EntityState => System.Data.Entity.EntityState

    更多信息:http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6

    您可以获取源并修改 EFContextProvider.cs 以使用这些命名空间。

    【讨论】:

      【解决方案4】:

      最新的 Nuget Packagae 似乎有问题(主要是实体 FramewroK 的 alpha 版本)。

      我卸载了当前的 BreezeNuget 包,然后安装了早期版本,一切正常(使用旧版本我必须将属性更改为 Jsonformater,oDataActionfilter 而不是 Breezecontroller)

      Install-Package Breeze.MVC4WebApi -Version 0.78.1

      【讨论】:

      • 我严重怀疑 [BreezeController] 属性是否存在问题,并且还怀疑恢复到其他属性(保留在所有产品版本中)是否会产生任何影响。欢迎你证明这一点。正如其他地方所说,Breeze.NET 组件尚未针对 alpha EF 进行过尝试。 请注意:当您在项目中加入一些不寻常的东西时,请告诉我们。当每个人都知道你是如何走出困境时,他们会对你更有帮助。
      • 当我使用 Nuget 获取 Breeze 包时,它默认下载 EF alpha 版本,我没有故意或特意这样做。可能您可以通过依赖关系绑定到特定版本的 EF。此外,我必须恢复 Breeze 属性,因为我使用的是旧版本的 Breeze,它不会编译 Breeze 属性。我并不是说 BreezeController 有问题,我不得不将它恢复回来,因为我使用的是旧版本的 Breeze 包。
      • 查看我上面的答案,我猜你是如何获得 EF 6-alpha 的
      【解决方案5】:

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

      这是带有更新代码的gist。您必须在 Breeze.WebApi 项目中更新到 Entity Framework 6 才能使其工作。

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

      【讨论】:

        猜你喜欢
        • 2014-10-18
        • 2014-07-02
        • 1970-01-01
        • 1970-01-01
        • 2017-04-25
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        • 2023-01-02
        相关资源
        最近更新 更多