Npgsql,保存日期时间值时出错(“CreatedAt”列中的空值违反了非空约束)

我有以下模型:


public class Product

{

    public int Id { get; set; }


    public string Name { get; set; }


    public string Description { get; set; }


    public string Category { get; set; }


    public decimal Price { get; set; }


    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]

    [ScaffoldColumn(false)]

    public DateTime CreatedAt { get; set; } = DateTime.Now;

}

以及以下应用程序上下文:


public class ApplicationContext : DbContext

{

    private readonly string _connectionString;


    public DbSet<Product> Products { get; set; }


    public ApplicationContext(IConfiguration configuration)

    {

        _connectionString = configuration.GetConnectionString("Sportshop");

    }


    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

    {

        optionsBuilder.UseNpgsql(_connectionString, b => b.MigrationsAssembly("Web"));

    }

}

接下来我将向您展示我的 PostgreSQL 数据库架构的屏幕:

http://img2.mukewang.com/64aa109f0001750f12590272.jpg

我试图在下一个代码的帮助下保存一个新实体:


    public ViewResult Index()

    {

        Product product = new Product

        {

            Name = "P1",

            Category = "test",

            Price = 1000,

            Description = "Hello !!!"

        };


        _applicationContext.Products.Add(product);

        _applicationContext.SaveChanges();



        return View(// ... some view data);

    }

但结果我看到了这个错误。我不明白为什么。

http://img3.mukewang.com/64aa10b3000122b806530273.jpg

我绝对确定CreatedAt保存期间该字段不为空。查看调试屏幕:

http://img3.mukewang.com/64aa10ca000116ee08530559.jpg

错误在哪里?



MM们
浏览 129回答 1
1回答

叮当猫咪

你的财产确实有价值,但它也有装饰[DatabaseGenerated(DatabaseGeneratedOption.Computed)]。通过使用Computed,您告诉 EF Core 必须将属性的值保留给数据库。换句话说,数据库完全负责在每次查询期间生成或计算值。生成的插入语句将如下所示INSERT INTO Products (Id, Name, Description, Category, Price) ...这将失败,因为CreatedAt有 NOT NULL 设置,显然没有默认值。您可以尝试使用 Fluent API 为该字段指定默认值:protected override void OnModelCreating(ModelBuilder modelBuilder){    modelBuilder.Entity<Product>()        .Property(b => b.CreatedAt)        .HasDefaultValueSql("getdate()");}只要 Npgsql 支持,它就应该有效,但我不确定。如果它不起作用,那么您可能别无选择,只能删除该属性并将价值创造掌握在自己手中。
打开App,查看更多内容
随时随地看视频慕课网APP