【问题标题】:EntityFramework Core 2 - ValueGeneratedOnAddOrUpdate [duplicate]EntityFramework Core 2 - ValueGeneratedOnAddOrUpdate [重复]
【发布时间】:2019-07-25 17:16:56
【问题描述】:

我有一个场景,我的模型有 CreatedOn 和 UpdatedOn 字段,按照我在 EF Core 文档中找到的内容,我实现了我的类,如下所示

builder.Entity<Registro>(b =>
    {
        b.Property<DateTime>("CreatedOn")
            .IsRequired()
            .ValueGeneratedOnAdd()
            .HasDefaultValueSql("GETUTCDATE()");

        b.Property<DateTime>("UpdatedOn")
            .IsRequired()
            .ValueGeneratedOnAddOrUpdate()
            .HasDefaultValueSql("GETUTCDATE()"); ;
    });

public class Registro
{
    public Guid Id { get; set; }
    public string Nome { get; set; }
}

在插入时,两个字段都保存了正确的值,但是更新并没有像我预期的那样发生,UpdatedOn 保留了保存值。它还遵循我如何进行实体更新

public void Put(Guid id, [FromBody]string value)
{
    var r = context.Registros.SingleOrDefault(x => x.Id == id);

    r.Nome = value;

    context.SaveChanges();
}

【问题讨论】:

  • HasDefaultValueSql 字面意思是设置底层 SQL 表的默认值。在保存之前,您需要更新模型中的 UpdatedOn 属性
  • @DarrenLamb 谢谢我正在考虑这样做,但是 ValueGeneratedOnAddOrUpdate 的行为是什么? OrUpdate 什么时候会生成一个值?
  • 它只是让 EF 知道值是为添加或更新的实体生成的,它不保证 EF 会设置实际机制来生成值。 docs.microsoft.com/en-us/ef/core/modeling/…
  • @DarrenLamb thx,现在我注意到我完全忽略了红色框,我会更加小心

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


【解决方案1】:

要让您的 UpdatedOn 时间戳自动更新,您可以选择的一种方法是实现一个描述功能的接口并重载 DbContexts SaveChanges 方法。

public interface IUpdateable 
{ 
    DateTime UpdatedOn { get; set; }  
}

public class Registro : IUpdateable
{
    public Guid Id { get; set; }
    public string Nome { get; set; }
    public DateTime UpdatedOn { get; set; }
}

然后在你的 Context 类中

public override int SaveChanges()
{
    var currentDateTime = DateTime.Now;
    var entries = ChangeTracker.Entries().ToList();

    // get a list of all Modified entries which implement the IUpdatable interface
    var updatedEntries = entries.Where(e => e.Entity is IUpdateable)
            .Where(e => e.State == EntityState.Modified)
            .ToList();

    updatedEntries.ForEach(e =>
    {
        ((IUpdateable)e.Entity).UpdatedOn = currentDateTime;
    });


    return base.SaveChanges();
}

【讨论】:

  • 这很有趣。如果我错了,请纠正,但由于实体已经在内存中,这不应该导致性能问题吗?
  • 我没有注意到。但是有人可以纠正我!
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2017-03-14
  • 2022-01-27
  • 2017-05-27
  • 2016-12-23
相关资源
最近更新 更多