Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#模型构造函数中初始化属性而不在MVC中覆盖它_C#_Asp.net Mvc_Entity Framework_Asp.net Core - Fatal编程技术网

在C#模型构造函数中初始化属性而不在MVC中覆盖它

在C#模型构造函数中初始化属性而不在MVC中覆盖它,c#,asp.net-mvc,entity-framework,asp.net-core,C#,Asp.net Mvc,Entity Framework,Asp.net Core,我试图在第一次通过实体框架创建记录时初始化CreatedAt和Guid值。但是,当使用相同的模型执行更新时,我不想覆盖该值。(因为它是创建的时间戳) 这就是我目前拥有的: public EntityBase() { if(this.CreatedAt == null) this.CreatedAt = DateTimeOffset.Now; this.UUId = new Guid(); this.Updated

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

这就是我目前拥有的:

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

        this.UUId = new Guid();
        this.UpdatedAt = DateTimeOffset.Now;         
    }
每当我创建此模型的实例时,就会调用构造函数并创建一个新的DateCreated值。这是一种有效的方法吗?

编辑:

或在构造函数中:

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

或在构造函数中:

if (this.CreatedAt == default(DateTimeOffset))
{
     this.CreatedAt = DateTimeOffset.Now;
}
您可以简单地从构造函数中删除“if”并保持原样—为字段指定默认值。对于新创建的实体,这些将用作默认值。当您的应用程序将设置一些值并将其存储到某个存储器中,然后稍后尝试检索时,将恢复持久化值,因为数据层将尝试将这些属性设置为其持久化值,并将调用属性设置器,而不管值是什么

public EntityBase()
{
    this.CreatedAt = DateTimeOffset.Now;
    this.UUId = new Guid();
    this.UpdatedAt = this.CreatedAt;
}
更新记录时,该记录将已被检索,因此创建日期具有非默认值

还要注意的是,我如何将“UpdatedAt”设置为相同的“CreatedAt”-以不获取不同的时间值(在您的示例中可能会有微小的差异)-这是一个不相关的提示。

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

public EntityBase()
{
    this.CreatedAt = DateTimeOffset.Now;
    this.UUId = new Guid();
    this.UpdatedAt = this.CreatedAt;
}
更新记录时,该记录将已被检索,因此创建日期具有非默认值

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

对于C#7,只需使用带有默认值的自动道具:

public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
只有当它为空时,才会将其设置为
DateTimeOffset.UtcNow

对于C#7,只需使用带有默认值的自动道具:

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


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

最好的方法是对
CreatedAt
使用数据库默认约束,并将属性标记为数据库生成的。如果您希望在实体框架中自动处理创建和更新日期,我们将使用覆盖savechanges()并使用接口标记这些类。最好的方法是对
CreatedAt
使用数据库默认约束,并将属性标记为数据库生成的。如果您希望在实体框架中自动处理创建和更新日期,我们将使用覆盖savechanges()并用接口标记这些类。非常感谢,伙计,但我真的不明白。如果CreatedAt是DateTimeOffset的默认值,则将其设置为now?这是如何实现我所需要的?通常,如果CreatedAt设置为任何值,它将忽略任何试图忽略它的尝试。如果是默认值,那么保存当前日期。我明白了。因此,如果日期是1900-01-1(或其他任何日期),这意味着它没有被明确设置,所以设置它。如果是明确设置的,忽略它?我不明白为什么是-1'd:/我检查了所有问题并编辑了它们(花了很长时间),但我仍然无法发布任何内容。这真的很糟糕。非常感谢,伙计,但我真的不明白。如果CreatedAt是DateTimeOffset的默认值,则将其设置为now?这是如何实现我所需要的?通常,如果CreatedAt设置为任何值,它将忽略任何试图忽略它的尝试。如果是默认值,那么保存当前日期。我明白了。因此,如果日期是1900-01-1(或其他任何日期),这意味着它没有被明确设置,所以设置它。如果是明确设置的,忽略它?我不明白为什么是-1'd:/我检查了所有问题并编辑了它们(花了很长时间),但我仍然无法发布任何内容。这真的很糟糕。嗯,我有点明白你的意思。谢谢。为什么数据不会被覆盖?如果我将模型绑定到一个实体,它不会覆盖日期和UUId吗?类构造函数将作为第一件事被调用。然后只会发生任何覆盖。因此,任何赋值都发生在构造函数执行之后,因此会覆盖默认值。完全正确!这就是我困惑的原因。因此,如果我必须分配或更新CreatedAt或UUID,它确实会覆盖entities属性。那么这是如何解决的呢?我想,我必须只显式地分配UpdatedAt,而不是UUId和CreatedAt,它们永远不会被覆盖?如果您还可以在访问数据存储的地方共享一些代码,我将能够更好地帮助您。你在用EF吗?我不明白为什么是-1'd:/我把所有的问题都整理了一遍(花了很长时间),但我还是不能发布任何东西。这真的很糟糕。嗯,我有点明白你的意思。谢谢。为什么数据不会被覆盖?如果我将模型绑定到一个实体,它不会覆盖日期和UUId吗?类构造函数将作为第一件事被调用。然后只会发生任何覆盖。因此,任何赋值都发生在构造函数执行之后,因此会覆盖默认值。完全正确!这就是我困惑的原因。因此,如果我必须分配或更新CreatedAt或UUID,它确实会覆盖entities属性。那么这是如何解决的呢?我想,我必须只显式地分配UpdatedAt,而不是UUId和CreatedAt,它们永远不会被覆盖?如果您还可以在访问数据存储的地方共享一些代码,我将能够更好地帮助您。你在用EF吗?我不明白为什么是-1'd:/我检查了所有的问题并编辑了它们(花了很长时间),但我仍然不能发布任何东西