【问题标题】:RawSQL and auto-generated keys in EF Core 3.1EF Core 3.1 中的 RawSQL 和自动生成的密钥
【发布时间】:2021-04-18 06:24:34
【问题描述】:

我有一个带有 Guid 主键的模型。我希望数据库在插入时生成一个密钥,所以我添加了以下注释:

    public class Employee
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public Guid employee_id { get; set; }

        [Required]
        public int employee_number { get; set; }

        //more props...
    }

现在我预计使用 RawSQL 的插入不会期望主键,但是通过 ExecuteSqlRaw 执行以下语句时不起作用:

INSERT INTO employees (employee_number/**, more props*/) 
VALUES (123 /**,more props*/)

关于不可空主键的数据库导致错误。显式插入一些随机的 Guid 作品,但我认为数据库会处理这个问题。

Identity注解错了吗?

【问题讨论】:

    标签: sql sql-server asp.net-core entity-framework-core


    【解决方案1】:

    你可能会错过一步。

    当我添加迁移时,ef core 会生成一个迁移文件。那么这里需要添加defaultValueSql: "newsequentialid()"

    执行Update-Database后,我可以用RawSQL插入记录了。

    编辑:

    在 DbContext 中使用 HasDefaultValueSql 的另一种方法。

    protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            
            modelBuilder.Entity<Employee>()
               .Property(b => b.employee_id)
               .HasDefaultValueSql("newsequentialid()");
        }
    

    【讨论】:

    • 为什么会这样?在this 线程中明确指出我的解决方案应该按预期工作,但迁移不会为主键行创建newsequentialid() 属性。
    • @Beltway,你能用RawSql成功插入数据吗?
    • 抱歉回复晚了。是的,我可以,但只有在手动创建 Guid 并明确传递它时。
    • @Beltway,好的,我明白它是如何在这里工作的。您可以参考编辑后的答案。
    • 有没有办法通过Fluent API或者数据注解来实现呢?我不想弄乱自动生成的迁移或表格。
    猜你喜欢
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2022-01-20
    • 2020-12-25
    相关资源
    最近更新 更多