1

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

数据库上下文

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)"
}
4

5 回答 5

2

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

首先,我打赌您正在使用 Visual Studio 中的可视化“管理 NuGet 包”对话框。

其次,我敢打赌你在左上角的组合框中选择了“包括售前赛”。这是我可以重现您的经历的唯一方法。请您检查该组合框设置并在此处为我们发表评论吗?

如果是这样,如果项目中没有 EF,NuGet 将安装 EF v.6 alpha,如果项目中没有,则将 EF 5 升级到 EF 6。哎哟! 如果您单独升级现有项目的 EF 包,也会发生这种情况。

我强烈建议每个人都坚持“仅稳定”设置,除非你绝对确定你想要一个预发布包;然后请记住将其设置回“仅稳定”,因为组合框设置为“粘性”。

是的,我们可以在 NuGet 包中限制 EF 版本的上限……也许我们会这样做。坦率地说,这与 NuGet 指南相反,管理所有版本控制排列非常困难,并且在偏离标准路径时承担责任很重要。

我不清楚您是如何获得缺少BreezeControllerAttribute的旧版本Breeze.WebApi.dll的。除了安装Breeze.MVC4WebApiClientSample NuGet 包之外,您是如何了解[BreezeController]属性的?这是唯一可以在其中找到该属性的 NuGet 包......并且安装(或升级到)该包应该已将正确的 Breeze.WebApi.dll 引用传递给伴随的“包”文件夹。

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

于 2012-12-29T00:29:55.640 回答
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 属性一起仍然存在于最新版本的微风中。

于 2012-12-27T18:22:20.820 回答
1

由于 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 以使用这些命名空间。

于 2012-12-27T19:54:37.490 回答
0

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

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

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

于 2013-07-16T13:46:08.450 回答
0

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

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

安装包 Breeze.MVC4WebApi -版本 0.78.1

于 2012-12-26T01:55:04.670 回答