AFAIK,在添加之前Attach
相关代码,如果LocationAccount
,PrimaryCategory
是新项目,那么它们将被自动创建。如果其中任何一个(LocationAccount
,PrimaryCategory
) 存在于数据库表中,那么您将检索 409 状态代码。
根据我的测试,添加后Attach
相关代码,如果LocationAccount
and PrimaryCategory
存在,那么你可以创建新的Location
项目成功。但如果其中任何一个不存在,那么您可能会收到如下错误:
根据我的理解,您需要检查导航属性是否Location
存在。对于现有的导航属性项,您可以使用DbSet.Attach
方法来阻止附加实体插入,而新的导航属性项,您需要使用DbSet.Add
或者什么也不做。
此外,您可以在以下代码中添加ConfigureMobileApp
你的方法Startup.MobileApp.cs
文件包含错误详细信息并返回到您的客户端。
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
UPDATE:
默认情况下,引用的实体 (LocationAccount
,PrimaryCategory
) 将被插入,如果存在任何实体,那么您将收到 409,如下所示:
添加后_context.Accounts.Attach(item.LocationAccount);
,你可以创建Location
与现有引用实体有关系的实体(LocationAccount
,PrimaryCategory
),如果引用的实体(LocationAccount
,PrimaryCategory
) 不存在,您将收到以下错误:
对于您的场景,您发布现有引用的实体 (LocationAccount
,PrimaryCategory
) 的位置。即使可以成功创建位置项,但根据您的实体模型,您可能会遇到如下 500 错误:
您可以标记Locations
财产在Account
实体模型为JsonIgnore
。或者您需要修改实体模型以在处理序列化时忽略引用循环。
此外,您可以利用以下代码片段而不是CreatedAtRoute
.
return Json(current, new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
我还尝试在下设置 SerializerSettings 的全局设置Startup.MobileApp.cs
如下,但它没有按预期工作。
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
此外,您可以关注Web API 中的循环引用处理 https://code.msdn.microsoft.com/Loop-Reference-handling-in-caaffaf7以获得更详细的方法。