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 与外键对象一起使用的主要内容,如果未能解决你的问题,请参考以下文章