C#Pomelo MySQL触发器onUpdate时间戳

时间:2019-12-23 09:13:30

标签: c# entity-framework pomelo-entityframeworkcore-mysql

我正在尝试在Pomelo.MySQL中创建一个具有onUpdate时间戳的日志表,但是我似乎无法通过Entity Framework触发它。

这是我的桌子模型

public class OrganisationLog
{
    [Key]
    public int Id { get; set; }

    [Column(TypeName = "VARCHAR(1024)")]
    [Required(AllowEmptyStrings = false)]
    public string MachineName { get; set; }

    [DefaultValue("CURRENT_TIMESTAMP")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public DateTime LastContact { get; set; }

    public int OrganisationId { get; set; }

    [ForeignKey("OrganisationId")]
    public Organisation Organisation { get; set; }
}

下面是应该起作用的功能。

private void UpdateOrganisationLog(Organisation organisation, string machineName)
{
    try
    {
        OrganisationLog organisationLog = _context.OrganisationLogs
            .Where(x => x.OrganisationId == organisation.Id && x.MachineName == machineName)
            .FirstOrDefault();

        if (organisationLog == null)
        {
            organisationLog = new OrganisationLog()
            {
                MachineName = machineName,
                OrganisationId = organisation.Id,
                LastContact = DateTime.Now
            };
            _context.OrganisationLogs.Add(organisationLog);
        }
        else
        {
            _context.Update(organisationLog);
        }
        _context.SaveChanges();
    }
    catch (Exception e)
    {
        Console.WriteLine("Error " + e.Message);
    }
}

我最终使它与手动SQL语句一起使用,但是我想通过Entity Framework弄清楚它。

_context.Database.ExecuteSqlCommand($"UPDATE organisationlogs SET LastContact = CURRENT_TIMESTAMP(6) WHERE Id = {organisationLog.Id}");

CURRENT_TIMESTAMP(6)而不是CURRENT_TIMESTAMP()有关系吗?不确定为什么实体框架将其设置为(6)

1 个答案:

答案 0 :(得分:0)

根据Default Values上的EF Core文档,不支持数据注释:

  

您不能使用数据注释设置默认值。

如果EF Core会支持它,那么将它用于CURRENT_TIMESTAMP可能仍然行不通,因为它不是System.DateTime值,但从技术上讲是SQL片段。

在您的情况下,使用.HasDefaultValueSql()指定SQL片段的FluentAPI配置应适用于Pomelo 3.0.1 +:

class MyContext : DbContext
{
    // ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<OrganisationLog>(entity =>
        {
            entity.Property(e => e.LastContact)
                .HasDefaultValueSql("CURRENT_TIMESTAMP");
        });
    }
}

DatabaseGenerated(DatabaseGeneratedOption.Computed)属性不是必需的。

有关与datetime结合实现对CURRENT_TIMESTAMP列的支持的修补程序,请参见我们的GitHub存储库上的#959以及更多详细信息。