我有以下模型: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 數據庫架構的屏幕:我試圖在下一個代碼的幫助下保存一個新實體: 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); }但結果我看到了這個錯誤。我不明白為什么。我絕對確定CreatedAt保存期間該字段不為空。查看調試屏幕:錯誤在哪里?
1 回答

叮當貓咪
TA貢獻1776條經驗 獲得超12個贊
你的財產確實有價值,但它也有裝飾[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 支持,它就應該有效,但我不確定。如果它不起作用,那么您可能別無選擇,只能刪除該屬性并將價值創造掌握在自己手中。
- 1 回答
- 0 關注
- 165 瀏覽
添加回答
舉報
0/150
提交
取消