使用 TableController 和 AzureMobileApps 发布新实体时出现错误 500

2024-06-01

我在 AzureMobileApps 上使用 TableController 时遇到问题。我使用脚手架在 Visual Studio 中创建了一个新的 Azure Mobile App TableController。在帖子中,我修改了生成的代码,在 dbContext 上添加了附加,以避免在子表上插入期间创建引用的项目。这就是生成的代码:

 public async Task<IHttpActionResult> PostLocation(Location item)
    {
        _context.Accounts.Attach(item.LocationAccount);
        _context.Categories.Attach(item.PrimaryCategory);

        Location current = await InsertAsync(item);
        return CreatedAtRoute("Tables", new { id = current.Id }, current);
    }

问题是,每次调用 post 方法时,即使实体已正确插入,我也会在“CreatedAtRoute”事件上收到 500 内部服务器错误。

知道问题出在哪里吗?!

更新:实体模型

public class Account : EntityData
{
    public Account()
    {
        this.Locations = new HashSet<Location>();
    }

    [Required]
    public string Username { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    public virtual ICollection<Location> Locations { get; private set; }
}

public class Location : EntityData
{
    [Required]
    public Account LocationAccount { get; set; }

    ........
}   

感谢大家。


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.Re‌​ferenceLoopHandling = ReferenceLoopHandling.Ignore;

此外,您可以关注Web API 中的循环引用处理 https://code.msdn.microsoft.com/Loop-Reference-handling-in-caaffaf7以获得更详细的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 TableController 和 AzureMobileApps 发布新实体时出现错误 500 的相关文章

随机推荐