在实体框架模型中包含只读列

时间:2021-01-26 21:28:51

标签: entity-framework .net-attributes

已解决:您不讨厌在发布一分钟后自己找到解决方案吗?我的自我回答如下。

假设我有一个 .NET Entity Framework 模型类:

public class Foo
{
    public int FooId { get; set; }

    public string Description { get; set; }

    public DateTime Created { get; set; }

    public DateTime LastUpdated { get; set; }
}

我的 SQL Server 表中的 Created 和 LastUpdated 列(均为 DATETIME2 类型)具有 DEFAULT 约束 (SYSUTCDATETIME())。每当描述更改时,AFTER UPDATE 触发器都会将 LastUpdated 设置为 SYSUTCDATETIME

在我的代码中,当我从 Foo 表中读取时,我希望包含 Created 和 LastUpdated,因为我想使用它们的值。但是当我向表中添加一行时,我不希望它们包含在 Add 中,因为我希望 SQL Server 使用我配置它使用的默认值。我以为这只是一个问题

Foo foo = new Foo
{
    Description = "This is my latest foo."
}

但 C# 为这两个日期属性赋予了它们自己的默认值 0001-01-01T00:00:00,该值不为空,这就是表中记录的内容。

不是有一个属性告诉框架不要将属性写回数据库吗?它不是 NotMapped,因为这会阻止读取值。

1 个答案:

答案 0 :(得分:0)

`在发布问题后立即找到答案,您不讨厌吗?

  • [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 从插入和更新中省略该属性。
  • [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 省略插入中的属性。

后者将处理 EndDate,我没有在我的帖子中说明。我让数据库在插入时将默认值设置为 9999-12-31T23:59:59,但我的应用程序稍后会在 Foo 到期时更改其值。

令我震惊的是,他们根据在不同场景中不会想到的特定用例进行命名。它们应该与 [SkipOnInsert][SkipOnUpdate] 一起使用(然后可以根据需要组合)。