如何自动填充CreatedDate和ModifiedDate?

Mon*_*mer 12 c# entity-framework asp.net-core-mvc

我正在学习ASP.NET核心MVC,我的模型是

namespace Joukyuu.Models
{
    public class Passage
    {
        public int PassageId { get; set; }
        public string Contents { get; set; }


        public DateTime CreatedDate { get; set; }
        public DateTime ModifiedDate { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Passage表用于保存我写的段落.

脚本

  • Create视图只有一个字段Contents来输入一个段落. CreatedDate并且ModifiedDate必须由服务器自动设置为相等(使用UTC格式).

  • Edit视图只有一个字段Contents来编辑一个段落.ModifiedDate必须由服务器自动设置.

根据上述场景,我必须将哪些属性附加到CreatedDateModifiedDate属性以使它们由服务器自动填充?

Bas*_*ili 28

我必须将哪些属性附加到CreatedDate和ModifiedDate属性,以使服务器根据上述方案自动填充它们?

解决方案1)

namespace Joukyuu.Models
{
    public class Passage
    {
        public int PassageId { get; set; }
        public string Contents { get; set; }


        public DateTime CreatedDate { get; set; }
        public DateTime ModifiedDate { get; set; }

       public Passage()
       {          
         this.CreatedDate  = DateTime.UtcNow;
         this.ModifiedDate = DateTime.UtcNow;
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过编辑,您必须自己更改/更新它!

解决方案2)

自定义属性:

[SqlDefaultValue(DefaultValue = "getutcdate()")]
public DateTime CreatedDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

实体框架6代码第一个默认值

解决方案3)

在计算的帮助下:

[Required, DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedUtc { get; set; 


  "dbo.Products",
            c => new
                {
                    ProductId = c.Int(nullable: false, identity: true),
                    Name = c.String(),
                    CreatedUtc = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"),
                })
            .PrimaryKey(t => t.ProductId);
Run Code Online (Sandbox Code Playgroud)

https://andy.mehalick.com/2014/02/06/ef6-adding-a-created-datetime-column-automatically-with-code-first-migrations/

解决方案4) 您也可以通过手动修改查询来执行命令拦截器.

解决方案5) 使用Repository模式管理数据创建并通过CreateNew进行设置这是我最喜欢的解决方案!

https://msdn.microsoft.com/en-us/library/ff649690.aspx

解决方案6) 只需在UI或虚拟机中设置或进入.


Entity Framework Core 1.0中:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Passage>()
        .Property(b => b.CreatedDate )
        .HasDefaultValueSql("getdate()");
}
Run Code Online (Sandbox Code Playgroud)

  • 关于你的 EF Core 1 代码(最底部),你为什么不使用 `getutcdate()` 而不是 `getdate()`? (2认同)
  • 遗憾的是,99% 的在线解决方案都提出了一种将代码与特定数据库引擎联系起来的方法。`.HasValueGenerator()` 属性允许使用 .Net 代码作为初始化程序。它并不适合所有情况,但适合大多数情况。 (2认同)

Ara*_*ash 8

对于那些使用异步系统(SaveChangesAsync)和.net core的用户,最好将以下代码添加到DbContext类中。

    public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = default(CancellationToken))
    {
        var AddedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Added).ToList();

        AddedEntities.ForEach(E =>
        {
            E.Property("CreationTime").CurrentValue = DateTime.Now;
        });

        var EditedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Modified).ToList();

        EditedEntities.ForEach(E =>
        {
            E.Property("ModifiedDate").CurrentValue = DateTime.Now;
        });

        return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
    }
Run Code Online (Sandbox Code Playgroud)

并且您还可以定义如下的类或接口。

public class SaveConfig
{
    public DateTime CreationTime { get; set; }
    public DateTime? ModifiedDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

只是从SaveConfig类继承实体。

  • 我认为这会对性能造成影响。每次,它都会迭代所有实体。 (2认同)
  • @MukeshKumar遍历保存和修改的条目,是的。除非您在单个请求中保存数千个条目,否则您就可以(即使那样也可以)。这是一个很好的答案。-Arash异步方法不是不可思议的。它们仍然会影响性能。 (2认同)

Eld*_*dho 7

如果您首先使用代码,您可以试试这个

[Required, DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedDate { get; set; }
Run Code Online (Sandbox Code Playgroud)

关于迁移

AddColumn("Passage", "CreatedDate", n => n.DateTime(nullable: false, defaultValueSql: "GETDATE()"));
Run Code Online (Sandbox Code Playgroud)

更多参考这里类似的答案

或者您可以全局覆盖saveChangesNote* 如果您有该CreatedDate字段,这将影响整个模型

public override int SaveChanges()
{
  DateTime saveTime = DateTime.Now;
  foreach (var entry in this.ChangeTracker.Entries()
      .Where(e => e.State == (EntityState) System.Data.EntityState.Added))
   {
     if (entry.Property("CreatedDate").CurrentValue == null)
       entry.Property("CreatedDate").CurrentValue = saveTime;
   }
   return base.SaveChanges();  
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

12503 次

最近记录:

6 年 前