我有以下模型: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 关注
- 128 浏览
添加回答
举报
0/150
提交
取消