【问题标题】:Initializing a property in a C# model constructor without overwriting it in MVC在 C# 模型构造函数中初始化属性而不在 MVC 中覆盖它
【发布时间】:2018-06-25 07:24:57
【问题描述】:

我试图在第一次通过实体框架创建记录时初始化 CreatedAt 和 Guid 值。但是当使用相同的模型执行更新时,我不想覆盖那个值。 (因为它是创建的时间戳)

这是我目前拥有的:

 public EntityBase()
    {
        if(this.CreatedAt == null)
            this.CreatedAt = DateTimeOffset.Now;

        this.UUId = new Guid();
        this.UpdatedAt = DateTimeOffset.Now;         
    }

每当我创建此模型的实例时,都会调用构造函数并生成一个新的 DateCreated 值。这会是一种有效的方式吗?

【问题讨论】:

  • 最好的方法是为CreatedAt 使用数据库默认约束并将属性标记为数据库生成。
  • 如果您希望在实体框架中自动处理创建和更新日期,我们使用 this technique 覆盖 savechanges() 并使用接口标记这些类。

标签: c# asp.net-mvc entity-framework asp.net-core


【解决方案1】:

您可以简单地从构造函数中删除“if”并保持原样 - 为字段分配默认值。对于新创建的实体,这些将用作默认值。当您的应用程序将设置一些值并将其存储到某个存储中并在稍后尝试检索它时,将恢复持久值,因为数据层将尝试将这些属性设置为它们的持久值,并将调用该属性设置器,无论值是什么。

public EntityBase()
{
    this.CreatedAt = DateTimeOffset.Now;
    this.UUId = new Guid();
    this.UpdatedAt = this.CreatedAt;
}

更新记录时,该记录已被检索,因此创建日期具有非默认值。

另请注意,我如何将“UpdatedAt”设置为相同的“CreatedAt” - 不会获得不同的时间值(您的示例中可能存在细微差异) - 有点不相关的提示。

【讨论】:

  • 嗯,我有点明白你在说什么,谢谢。为什么数据不会被覆盖?如果我将模型绑定到实体,它不会覆盖日期和 UUId 吗?
  • 首先调用类构造函数。然后只会发生任何覆盖。所以任何赋值都是在构造函数执行之后发生的,因此会覆盖默认值。
  • 没错!这就是为什么我很困惑。因此,如果我必须分配或更新 CreatedAt 或 UUID,它确实会覆盖实体属性。那么这是如何解决的呢?我想,我必须只显式分配 UpdatedAt 而不是 UUId 和 CreatedAt,它们永远不会被覆盖?
  • 如果您还可以共享一些访问数据存储的代码,我将能够为您提供更好的帮助。你在用 EF 吗?
  • 我不明白为什么这是-1'd:/我检查了所有问题并对其进行了编辑(花了很长时间),但我仍然无法发布任何内容。这真的很糟糕。
【解决方案2】:

在 C# 7 中,只需使用带有默认值的 auto 属性:

public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;

只有当它为空时,它才会设置为DateTimeOffset.UtcNow

【讨论】:

  • 我不明白为什么这是-1'd:/我检查了所有问题并对其进行了编辑(花了很长时间),但我仍然无法发布任何内容。这真的很糟糕。
【解决方案3】:

编辑:

或者在构造函数中:

if (this.CreatedAt == default(DateTimeOffset))
{
     this.CreatedAt = DateTimeOffset.Now;
}

【讨论】:

  • 非常感谢,但我不太明白。如果 CreatedAt 是 DateTimeOffset 的默认值,那么将其设置为 now?这如何达到我的需要?
  • 通常,如果 CreatedAt 设置为任何值,它将忽略任何覆盖它的尝试。如果是默认值,则保存当前日期。
  • 我明白了。因此,如果日期是 1900-01-1(或其他任何日期),则表示尚未明确设置,因此请设置它。如果已显式设置,忽略它?
  • 我不明白为什么这是-1'd:/我检查了所有问题并对其进行了编辑(花了很长时间),但我仍然无法发布任何内容。这真的很糟糕。
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2013-03-22
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多