我正在尝试在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)
。
答案 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以及更多详细信息。