C# 如何在DB first方法中不在EF Core Fluent API的HasComputedColumnSql中指定SQL表达式?
在早期版本的EF中,要指定计算列,我们将编写:C# 如何在DB first方法中不在EF Core Fluent API的HasComputedColumnSql中指定SQL表达式?,c#,sql-server,entity-framework-core,C#,Sql Server,Entity Framework Core,在早期版本的EF中,要指定计算列,我们将编写: modelBuilder .Entity<Type>() .Property(x => x.ComuptedProperty) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); modelBuilder .实体() .Property(x=>x.comptedproperty) .HasDatabaseGeneratedOption(DatabaseGe
modelBuilder
.Entity<Type>()
.Property(x => x.ComuptedProperty)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
modelBuilder
.实体()
.Property(x=>x.comptedproperty)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
这是有意义的,因为计算列的SQL表达式在数据库中只编写一次
但是,在迁移到EF Core后,我们意识到语法应该更改为:
modelBuilder
.Entity<Type>()
.Property(x => x.ComuptedProperty)
.HasComputedColumnSql("SQL Expression should be duplicated here");
modelBuilder
.实体()
.Property(x=>x.comptedproperty)
.HasComputedColumnSql(“此处应复制SQL表达式”);
当我们先编写代码时,这是有意义的。因为EF Core在创建表时使用此SQL表达式
然而,对于DB-first场景,这根本没有意义。我们试图将此参数保留为空,但它引发异常:
字符串参数“sql”不能为空
现在,当您想要一个数据访问生成器时,情况会变得更糟。我们怎么能忽略这个参数呢?事实上,在使用
HasComputedColumnSql
时,在为关联表生成SQL脚本时,必须指定将用于计算列的SQL查询。正如您所说,这只对代码优先的方法有用
在Database First方法中,您可以使用以下方法之一来创建PropertyBuilder类型(这些方法的描述来自XML文档):
ValueGeneratedOnAdd()。该值可以由客户端值生成器生成,也可以由数据库生成,作为保存实体的一部分
:将属性配置为在保存新实体或现有实体时生成值ValueGeneratedOnAddOrUpdate()
:将属性配置为在保存现有实体时生成值valueGeneratedUnUpdate()
ValueGeneratedOnAddOrUpdate()
方法。同样,EF文件说明:
这只是让EF知道值是为添加或更新的实体生成的,并不保证EF会设置实际的机制来生成值