Fluent API:如何将 HasComputedColumnSql 与外键对象一起使用

Posted

技术标签:

【中文标题】Fluent API:如何将 HasComputedColumnSql 与外键对象一起使用【英文标题】:Fluent API: how to use HasComputedColumnSql with foreign key objects 【发布时间】:2021-09-28 20:56:36 【问题描述】:

我在 Entity Framework Core 和 Fluent API 中使用代码优先的方法,我正在尝试为一个表创建一个列,该表具有基于该表的其他列生成的值。该表还包含外键,我想以不同于其 Id 的方式表示(例如,名为 name 的列)。

这是我目前情况的通用代码。

public class Book

    public int Id  get; set; 
    public string Title  get; set; 
    public int AuthorId  get; set; 
    public Author Author  get; set; 
    public string Display  get; set; 


public class Author

    public int Id  get; set; 
    public string FirstName  get; set; 
    public string LastName  get; set; 

    public virtual ICollection<Book> Books  get; set; 

我的DbContext 中的OnModelCreating 看起来像这样:

protected override void OnModelCreating(ModelBuilder modelBuilder)

    base.OnModelCreating(modelBuilder);
    
    // BOOK Definition
    modelBuilder.Entity<Book>(entity =>
    
        // Primary key
        entity.HasKey(p => p.Id);

        // Foreign key
        entity.HasOne(v => v.Author)
            .WithMany(v => v.Books)
            .HasForeignKey(v => v.AuthorId);

        // Properties
        entity.Property(p => p.Id).ValueGeneratedOnAdd();
        
        entity.Properties(p => p.Display)
            .HasComputedColumnSql("SOME SQL QUERY HERE?");
        
        // Other property definitions
    );
    
    // AUTHOR Definition
    modelBuilder.Entity<Author>(entity =>
    
        // Primary key
        entity.HasKey(p => p.Id);

        // Properties
        entity.Property(p => p.Id).ValueGeneratedOnAdd();
        
        // Other property definitions
    );

来自this website 和其他人,我了解到您可以在HasComputedColumnSql 中使用SQL 查询。但是,我不确定如何为我的用例创建这种查询。

TLDR;

如何在HasComputedColumnSql 的 SQL 查询中使用外键,将列的计算值设置为引用表(由外键引用)中的列值。

【问题讨论】:

【参考方案1】:

您不能引用另一个表,这不是计算列的工作方式。一种方法是创建一个标量函数并调用它。例如:

CREATE FUNCTION dbo.MySuperFunction (@value INT)
RETURNS INT AS
BEGIN
    -- do stuff with other tables
    RETURN @value*2
END

在你的 C# 代码中:

entity.Properties(p => p.Display)
    .HasComputedColumnSql("dbo.MySuperFunction([AuthorId])");

【讨论】:

以上是关于Fluent API:如何将 HasComputedColumnSql 与外键对象一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Web API odatamodelbuilder 使用 EF fluent API 映射

EF Fluent API上

Code First约定-Fluent API配置

EF CodeFirst 之 Fluent API

Code First约定-Fluent API配置

如何从 Fluent Api 检索实体配置