【问题标题】:Using pocos to update database使用 pocos 更新数据库
【发布时间】:2013-07-13 03:43:16
【问题描述】:

使用 ASP.NET WebAPI 和 EF 5.0。我创建了一个数据提供程序,它将查询数据库,然后将一个对象或对象集合返回给我的客户端,这恰好是一个 html5/angularjs 应用程序。

问题在于更新。例如,如果我有一个课程,它可以有很多学生。所以我有一个Course 表和一个Student 表,其fk 为StudentId。如果我需要编辑学生,EF 对象包含有关学生的所有信息,包括 CourseId 和 Course 对象本身。

由于此循环引用,WebAPI 在尝试序列化此数据时会呕吐,因此延迟加载已关闭 - 所以当我获得 Student poco 时,Course 为空。

然后,当我在客户端更新那个学生然后 PUT 回到我的 WebAPI 时,由于A referential integrity constraint violation occurred,我无法更新数据库。

我可以制作 DTO,但在我走这条路之前,我应该考虑其他模式来克服这个问题吗?对简化此过程的其他工具或软件包的建议?

【问题讨论】:

    标签: serialization asp.net-web-api entity-framework-5


    【解决方案1】:

    WebApi 难以序列化 EF 对象图,但您应该能够更新实体,即使导航属性为空,只要您的对象获得有效 Id

    通过将其状态设置为已修改,确保您正确地将其附加到上下文:

    public void Update(DbContext context, User user)
    {
        context.Entry(user).State = EntityState.Modified;
        context.SaveChanges();
    }
    

    【讨论】:

    • 是的,我正在这样做:(。错误发生在将状态设置为已修改,而不是实际在 SaveChanges() 上。有趣的是,您说即使导航属性为空,我也应该能够更新。我想知道是否还有其他事情发生......
    • 异常表明仍然存在一些关系。 Student 的导航属性是否用 [IgnoreDataMember] 装饰? stackoverflow.com/questions/9784507/…
    • 他们不是,但我想通了...您可以在 WebApiConfig 的寄存器中设置config.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;,它会忽略空导航属性...完美!感谢您指出正确的方向
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2014-12-21
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2017-04-28
    • 1970-01-01
    相关资源
    最近更新 更多