gpt4 book ai didi

c# - EF Core DatabaseGeneratedOption.Computed 不工作

转载 作者:行者123 更新时间:2023-12-03 17:35:56 36 4
gpt4 key购买 nike

我最近开始使用 .NET 核心 v2 .
我正在尝试通过在我的 中使用代码优先方法来设置我的数据库。 web-api 模板。

背景:我以前使用过 Laravel 框架,我想在迁移文件中复制 Laravel 的 timestamp() 函数,它基本上创建了两列:表中的 UpdatedAt 和 CreatedAt。

当使用 INSERT 或 UPDATE 列的 ORM (Elqoquent) 函数时,这些列中的值会填充正确的值。它是无缝的,您无需担心。

在我的 c# 代码中,我有以下模型

public class A {
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

public string Name { get; set; }

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime Created_At { get; set; } = DateTime.UtcNow;

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime Updated_At { get; set; }

// I've tried to add "= DateTime.UtcNow;" at the end of Updated_At as well
}

我还有以下用于为数据库提供种子的类。
public static class DatabaseSeeder
{
private static AppContext _context;

public static void SeedDatabase(this AppContext appContext)
{
_context = appContext;
_context.Database.EnsureCreated();

// Verify if data exist.
if (_context.A.Any())
{
return;
}

SeedAs();
}

private static void SeedAs()
{
var defaults = new A[]
{
new A
{
Name = "Value 1",
},
new A
{
Name = "Value 2",
},
new A
{
Name = "Value 3",
}
};

_context.As.AddRange(defaults);
_context.SaveChanges();
}
}

SeedDatabase 函数在 Startup 类的 Configure 函数中调用,如果数据库在启动时不包含任何数据,它基本上会为数据库播种。

问题:我遇到的问题是,当我第一次启动我的开发服务器时,应用程序注意到数据库不包含任何值,因此它尝试为其播种。返回以下错误:

MySql.Data.MySqlClient.MySqlException (0x80004005): Field 'Updated_At' doesn't have a default value



我似乎不明白为什么会失败,因为当我运行相同的代码时 通过删除 Updated_At 属性及其注释,没有返回错误,并且数据库按预期使用包含 DateTime.UtcNow 值的 Created_At 字段进行播种。

DatabaseGenerated(DatabaseGeneratedOption.Computed 注释的预期行为是根据插入或更新属性的数据类型生成数据库生成的值。

谁能告诉我为什么,当我尝试为我的数据库做种时它失败了。

最佳答案

首先,您已经在类中定义了 Created_At 的初始值:= DateTime.UtcNow;
这就是为什么它适用于 Created_At 但不适用于 Updated_At .自 Updated_At 没有初始值,并且数据库没有为此列定义任何默认值。

为了使其正常工作,您必须在 DbContext 类中为 SQL 列定义默认值。

我想,对于 MySQL,你应该使用函数 现在() :

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<A>()
.Property(s => s.Created_At )
.HasDefaultValueSql("NOW()");

modelBuilder.Entity<A>()
.Property(s => s.Updated_At )
.HasDefaultValueSql("NOW()");
}

文档: Data Annotations - DatabaseGenerated Attribute in EF 6 & EF Core

关于c# - EF Core DatabaseGeneratedOption.Computed 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48155743/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com