gpt4 book ai didi

c# - HasDbFunction,没有映射实体类的表值函数

转载 作者:行者123 更新时间:2023-12-05 03:19:44 25 4
gpt4 key购买 nike

到目前为止我发现的所有内容,如果您正在调用表值函数,则返回值必须是 IQueryable。例如:

public IQueryable<AlbumsByGenre> ufn_AlbumsByGenre_ITVF(int genreId)
=> FromExpression(() => ufn_AlbumsByGenre_ITVF(genreId));

大多数情况下,当我使用表值函数时,返回的表类型是 DTO。也就是说,它不匹配数据库中的任何实际表。这是一个例子:

CREATE FUNCTION dbo.ufn_AlbumsByGenre_ITVF(@GenreId int)
RETURNS TABLE
AS
RETURN(
SELECT
ar.ArtistName,
al.AlbumName,
g.Genre
FROM Genres g
INNER JOIN Albums al
ON g.GenreId = al.GenreId
INNER JOIN Artists ar
ON al.ArtistId = ar.ArtistId
WHERE g.GenreId = @GenreId
);

为返回类型创建一个实体会导致数据库中出现一个不必要的、未使用的和不需要的表。在这个例子中,表名是“AlbumsByGenre”。

有没有办法让返回类型成为未映射的类型以防止不必要的表?

最佳答案

目前(从 EF Core 6.0 开始)类型必须是模型类型(有或没有键)。有计划Raw SQL queries for unmapped types对于 EF Core 7.0,它可能允许也可能不允许您要求的映射。

所以现在你的类型必须在模型中注册(不能取消映射)。但是创建关联表不是强制性的,可以通过配置 ToView(null) 来避免,例如

modelBuilder.Entity<AlbumsByGenre>()
.HasNoKey() // keyless
.ToView(null); // no table or view

关于c# - HasDbFunction,没有映射实体类的表值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73364520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com