Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework ASP.Net-实体框架-MobileAppService-将实体对象推送到后端时出错_Entity Framework_Azure_Xamarin_Code First - Fatal编程技术网

Entity framework ASP.Net-实体框架-MobileAppService-将实体对象推送到后端时出错

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时会抛出未知异常(我

我正在使用Xamarin中的脱机同步功能在我的移动应用程序和Azure上托管的MobileAppService之间同步数据。 我使用EntityFramework(V6.1.3),使用VisualStudioPackageManager使用代码优先迁移创建数据库。数据库是Microsoft SQL Server,托管在Azure上。 当我使用脱机同步时,数据会毫无问题地插入到数据库中。但是,当我直接调用web api并以JSON格式发送对象时,服务器在执行
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
可能无效,请检查它。