Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在DB first方法中不在EF Core Fluent API的HasComputedColumnSql中指定SQL表达式?_C#_Sql Server_Entity Framework Core - Fatal编程技术网

C# 如何在DB first方法中不在EF Core Fluent API的HasComputedColumnSql中指定SQL表达式?

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

在早期版本的EF中,要指定计算列,我们将编写:

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会设置实际的机制来生成值