使用Entity Framework Core覆盖插入时的sql默认值(7)

时间:2017-01-16 01:34:00

标签: entity-framework entity-framework-core

我有一个包含[CreatedAtIsoUtc]列的表,用于设置Sql Server的默认值

migrationBuilder.CreateTable(
            name: "CurrentAccountLedger",
            columns: table => new
            {
                Id = table.Column<Guid>(nullable: false, defaultValueSql: "newsequentialid()"),
                CreatedAtIsoUtc = table.Column<DateTime>(nullable: false, defaultValueSql: "GETUTCDATE()"),                    
            }

        });

在原始sql server查询中,我可以插入一条记录并覆盖[CreatedAtIsoUtc]默认值。

在实体框架中,我似乎无法在执行Add()操作时覆盖此值。

关于如何让这个工作的任何想法?

2 个答案:

答案 0 :(得分:3)

实际上在EF Core v1.1.0中,你可以通过将属性设置为不同的任何值来实现,而不是类型的默认值(即数字为0false适用于boolnull适用于string和可空类型,default(DateTime)适用于您的情况)。唯一的当前限制是您无法使用0falsenull等覆盖sql默认值。

例如

db.CurrentAccountLedger.Add(new CurrentAccountLedger { });

会插入CreatedAtIsoUtc等于默认GETUTCDATE()的记录,而

db.CurrentAccountLedger.Add(new CurrentAccountLedger { CreatedAtIsoUtc = new DateTime(2017, 1, 1) });

将插入具有指定值的记录。

答案 1 :(得分:2)

您可以使用OnModelCreating()在上下文的HasDefaultValueSql()中为您的实体设置原始SQL默认值:

class YourContext : DbContext
{
    public DbSet<CurrentAccountLedger> CurrentAccountLedgers { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<CurrentAccountLedger>()
            .Property(x => x.CreatedAtIsoUtc)
            .HasDefaultValueSql("GETUTCDATE()");
    }
}