在序列化上使用JsonIgnore,但不在反序列化上使用;与部分模型混淆

时间:2013-03-28 10:02:13

标签: c# json serialization asp.net-web-api

我有一个Web API项目,由MSSQL数据库支持,包含(几乎)每个表上的创建和修改字段。这些字段上有触发器,分别在插入和更新记录时都会更新。

现在,当我在成功请求后将数据序列化为JSON时,我确实希望发送这些创建和修改的字段,以便发出请求的前端可以使用它来完成它们的工作。但是,我不想要的是,当数据被反序列化(或POST,返回)时,可以修改这些字段。很简单,你会说,只需在字段上使用[JsonIgnore]属性;只把它放在套装而不是放在上面。

现在这里的事情开始让我感到困惑。我的项目中的所有模型都是从实体模型(.edmx)自动生成的。因此,我无法直接在模型中编辑任何内容,但我必须在它们之上生成部分模型。我已经在其他SO线程中看到了使用[MetadataType]属性的解决方案,就像这个here一样。

但是如何(有效地)将这个应用到我的案例中?我一直在寻找,但还没有找到一个关于如何在“更高”的部分类中拆分自动实现属性的示例。即便如此,这也意味着我必须为我的所有模型创建部分类,这将非常麻烦。我无法想象以前从来没有人这样做过,所以不会有更优雅的方式来追求这个吗?

一个类的例子是:

public partial class Person
{
    [DataMember]
    public Nullable<System.DateTime> Created { get; set; }
    [DataMember]
    public Nullable<System.DateTime> Modified { get; set; }
}

1 个答案:

答案 0 :(得分:1)

最终我从Model-First方法切换到Code-First方法,这样我就可以更好地控制我的模型。

虽然经过大量搜索后,我来回答我自己的问题。这个问题的核心是我希望能够自动设置Created和Modified字段,并忽略前端的反序列化,同时仍然能够通过序列化将这些字段发送到前端。

解决方案在于覆盖SaveChanges类中的DbContext方法。在这个SO线程中给出了一个很好的例子:Entity Framework 4.1 DbContext Override SaveChanges to Audit Property Change。因此,所有礼貌都归于詹姆斯·波格兰(James Pogran),因为我在脑海中激发了这个想法,并以这种方式解决问题。

他所做的是检查DbEntity改变的方式。他根据是添加还是修改条目来设置Created和Modified字段,然后调用base.SaveChanges以继续正常操作。