gpt4 book ai didi

c# - EF Core 存储过程不同的返回结果

转载 作者:行者123 更新时间:2023-11-30 15:14:05 24 4
gpt4 key购买 nike

我有这个存储过程

CREATE PROCEDURE [dbo].[GetBooksByAuthor2]
AS
SELECT
books.Id, authors.Name AS Author, books.Name AS Book
FROM
dbo.Authors authors
INNER JOIN
dbo.AuthorsBooks authorsBooks ON authors.Id = authorsBooks.AuthorId
INNER JOIN
dbo.Books books ON books.Id = authorsBooks.BookId
GO

在 SQL Server Management Studio 中,结果如下所示:

Id| Author       | Book
--+--------------+----------
1 | FirstAuthor | GoodBook1
2 | FirstAuthor | GoodBook2
3 | FirstAuthor | GoodBook3
1 | SecondAuthor | GoodBook1
3 | SecondAuthor | GoodBook3

在 EF Core 中,我为我的存储过程添加了一个 View 模型

public class BookViewModel
{
[Key]
public int Id { get; set; }

public string Author { get; set; }
public string Book { get; set; }
}

我还在上下文类中添加了类似这样的内容:

public partial class StrangeContext : DbContext
{
public virtual DbSet<BookViewModel> Books2 { get; set; }
}

然后我在 Controller 操作中调用它

[HttpGet]
public JsonResult GetAuthors()
{
var result = db.Books2.FromSql("GetBooksByAuthor2").ToList();
return new JsonResult(result);
}

Json 的结果看起来像

[
{ "id": 1, "author":"FirstAuthor", "book":"GoodBook1"},
{ "id": 2, "author":"FirstAuthor", "book":"GoodBook2"},
{ "id": 3, "author":"FirstAuthor", "book":"GoodBook3"},
{ "id": 1, "author":"FirstAuthor", "book":"GoodBook1"},
{ "id": 3, "author":"FirstAuthor", "book":"GoodBook3"}
]

我做错了什么?错误的 View 模型? SecondAuthor 在哪里?

最佳答案

您将 BookViewModelId 定义为 Key,因此, Entity Framework 会在第一次查询“FirstAuthor”时进行缓存Id1。第二次遇到 Id 1 时,它使用当前上下文并根据缓存值填充实体。

这里的问题是您模棱两可的模型。 FirstAuthorSecondAuthor 怎么会有 Id = 1。

您可以删除模型中的 Key 属性,但这可能会导致困惑,无论您在哪里显示这些结果,一旦您想要保存这些实体中的任何一个,您将得到不可预测的结果。

您也可以尝试使用 AsNotracking(),但我强烈建议您不要这样做,因为一旦您尝试跟踪或保存更改,就会遇到麻烦。相反,调整您的存储过程以返回唯一行的唯一 ID。

关于c# - EF Core 存储过程不同的返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56097240/

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