我有一个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; }
}
答案 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
以继续正常操作。