如何在DB第一种方法中不指定EF Core Fluent API的HASCOMPETEDCOLUMNSQL中的SQL表达



在EF的先前版本中,要指定一个计算的列,我们将编写:

modelBuilder
.Entity<Type>()
.Property(x => x.ComuptedProperty)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

这是有道理的,因为计算列的SQL表达式是在数据库中写入的。

但是,在迁移到EF核心之后,我们意识到语法应更改为:

modelBuilder
.Entity<Type>()
.Property(x => x.ComuptedProperty)
.HasComputedColumnSql("SQL Expression should be duplicated here");

当我们首先进行代码时,这是有道理的。因为EF Core在创建表时使用此SQL表达式。

但是,对于DB的第一个方案,这根本没有意义。我们试图将此参数留为空,并引发了一个异常抱怨:

字符串参数'sql'不能为空

现在,当您想拥有数据访问生成器时,情况变得更糟。我们如何忽略此参数?

的确,当使用HasComputedColumnSql时,您必须在为关联表生成SQL脚本时指定将用于计算列的SQL查询。就像您说的那样,这仅对代码初步方法有用。

在数据库第一种方法中,您可以使用以下方法之一frol PropertyBuilder<TProperty>类型(描述来自这些方法的XML DocumentOaiton):

  • ValueGeneratedOnAdd():配置属性以仅在保存新实体时生成值,除非已设置了非NULL,非效率值,在这种情况下,设置值将被改为保存。该值可以由客户端值生成器生成,也可以由数据库生成,作为保存实体的一部分。
  • ValueGeneratedOnAddOrUpdate():配置一个属性以保存新实体或现有实体时生成的值。
  • ValueGeneratedOnUpdate():配置一个属性以保存现有实体时生成的值。

在您的情况下,因为它是一个计算的列,因此在添加和保存数据时可能会生成的值,因此您必须使用ValueGeneratedOnAddOrUpdate()方法。再次EF文档说:

这只是让EF知道为添加或更新实体生成值,它不能保证EF会设置实际机制以生成值。

最新更新