生成的列'UserCode'不能引用自动递增列。埃夫科



我有一个帐户表,ID自动增量为真。现在我要添加Computed Column。它可以通过以下逻辑为UserCode添加新值。

builder.Entity<Account>().Property(p => p.UserCode)
.HasComputedColumnSql(@"CONCAT(CASE WHEN Role= 0 THEN 'ADM' 
WHEN Role = 1 then 'ADV' 
WHEN Role = 2 then 'INV' 
WHEN ROle = 3 then 'EMP' END,
LPAD(ID, 8, '0'))");

下面是Account Entity和DB集合public DbSet<Account> Accounts { get; set; }

当我运行迁移时,它工作正常,但是当我执行更新数据库时,我得到以下错误。
生成的列'UserCode'不能引用自增列

PS:我不想使用任何触发器或多个更新语句。

这在MySQL是不允许的。(https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html)

AUTO_INCREMENT列不能用作生成的列定义。

这可能是由于这样的列违反了3NF,并且在MySQL引入生成列时决定不支持。生成的列需要可选地同时作为虚拟值和存储值工作,这将导致明显的"鸡肉"。egg"场景中的储存风味。

你的选择是,要么使用一个触发器插入一个依赖于键的存储列,违反3NF,并引入键和依赖于该键的列之间可能的数据不一致;编辑:在MySQL中似乎是一个非法的选项:)或者计算这个属性作为一个未映射的属性完全在你的实体。

例如:

public class Account
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AccountId { get; set; } 
public Roles Role { get; set; }
[NotMapped]
public string UserCode 
{
get 
{
switch(Role)
{
case Roles.Admin:
return $"ADM{AccountId:00000000}";
case Roles.Advisor:
return $"ADV{AccountId:00000000}";
case Roles.Invenstor:
return $"INV{AccountId:00000000}";
case Roles.Employee:
return $"EMP{AccountId:00000000}";
default:
return $"???{AccountId:00000000}";
}
}
}
}

最新更新