Entity framework ASP.Net-实体框架-MobileAppService-将实体对象推送到后端时出错
我正在使用Xamarin中的脱机同步功能在我的移动应用程序和Azure上托管的MobileAppService之间同步数据。 我使用EntityFramework(V6.1.3),使用VisualStudioPackageManager使用代码优先迁移创建数据库。数据库是Microsoft SQL Server,托管在Azure上。 当我使用脱机同步时,数据会毫无问题地插入到数据库中。但是,当我直接调用web api并以JSON格式发送对象时,服务器在执行Entity framework ASP.Net-实体框架-MobileAppService-将实体对象推送到后端时出错,entity-framework,azure,xamarin,code-first,Entity Framework,Azure,Xamarin,Code First,我正在使用Xamarin中的脱机同步功能在我的移动应用程序和Azure上托管的MobileAppService之间同步数据。 我使用EntityFramework(V6.1.3),使用VisualStudioPackageManager使用代码优先迁移创建数据库。数据库是Microsoft SQL Server,托管在Azure上。 当我使用脱机同步时,数据会毫无问题地插入到数据库中。但是,当我直接调用web api并以JSON格式发送对象时,服务器在执行InserAsync时会抛出未知异常(我
InserAsync
时会抛出未知异常(我将调试器连接到Azure上运行的MobileAppService,以确定是哪个命令导致了问题):
引发异常:mscorlib.dll中的“System.Web.Http.HttpResponseException”
api端点代码如下所示:
public async Task<IHttpActionResult> PostUser([FromBody] User item)
{
User current = await InsertAsync(item);
return CreatedAtRoute("Tables", new { id = current.Id , CreatedAt = System.DateTime.Now }, current);
}
令人震惊的是,如果我使用postman调用相同的api入口点,那么一切都可以正常工作。我很困惑,想不出还有什么是这个问题的根源
我捕获了web api引发的异常并检查了值。以下是远程调试模式下“监视”窗口的屏幕截图:
该错误可能与AzureVersion的值有关,但我不知道如何修复它,因为请求消息的版本设置为1.1(当我通过postman调用api时也是如此)。根据您的描述,我已从
Microsoft.Azure.Mobile.Server.dll
检查了InsertAsync
方法,我发现这个错误可能是由于在将数据保存到数据库时出现了一些异常(例如,等等)造成的。为了定位此问题,您需要捕获详细的错误消息,您可以遵循以下方法:
- 用于从响应中捕获详细错误,如下所示:
- 您可以使用
包装try catch
,以捕获详细错误,如下所示:InsertAsync
总之,您可以尝试定位特定错误并解决它。或者您可以提供有关此问题的更详细错误,以便我们查找。此问题源于使用作为NuGet软件包安装的AppServiceHelpers.Models.EntityData。我的实体都继承自
EntityData
,它向实体添加了一些属性,其中之一是AzureVersion
:
public class EntityData
{
...
[Version]
public string AzureVersion { get; set; }
}
public class MyEntityData
{
[Version]
[JsonProperty(PropertyName = "Version")]
public string AzureVersion { get; set; }
}
AzureVersion用属性[Version]
(Microsoft.WindowsAzure.MobileServices.Version
)标记。但是,JsonConvert
未实现此属性,并将名称AzureVersion
分配给序列化对象中的此属性(而不是Version
),该属性未在后端的MobileServiceContext中定义
为了解决这个问题,我定义了自己的EntityData helper类,并将属性名显式分配给Version
:
public class EntityData
{
...
[Version]
public string AzureVersion { get; set; }
}
public class MyEntityData
{
[Version]
[JsonProperty(PropertyName = "Version")]
public string AzureVersion { get; set; }
}
如果没有此解决方法,上下文仅适用于OfflineSync;因为,
Version
属性由MobileServiceClient.SyncContext
实现,对象存储在本地SQLStore中,属性正确设置为Version
,然后在SyncContext.PushAsync()之后推送到后端。但是,如果您将对象直接推送到后端,则该属性包含未识别的名称AzureVersion
,您可以发布一些代码吗?您使用的实体框架的版本是什么?什么类型的数据库?1.1版适用于HTTP。根据您的屏幕截图,我发现了一个关于ModelState与item.AzureVersion
的错误,您是否在用户实体中定义了此属性?我偷看了一下你的后端URL,我可以直接调用表/User/postaser
,用户信息{id:“005012c8577c46beb3a9140000000000”,密码:“test”,电子邮件:“test”}
。我假设由于离线同步可以工作,您发布的JsonContent
可能无效,请检查它。