[英]EF Core stored procedure different returning result
我有這個存儲過程
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中,我為我的存儲過程添加了一個視圖模型
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; }
}
然后我在控制器動作中調用它
[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"}
]
我做錯了什么? 錯誤的ViewModel? SecondAuthor在哪里?
您將BookViewModel
的Id
定義為Key ,因此,如果查詢Id
為1的'FirstAuthor',Entity Framework將首次緩存。 第二次遇到Id
1時,它使用當前上下文並根據緩存的值填充實體。
這里的問題是你的模棱兩可的模型。 FirstAuthor
和SecondAuthor
如何都具有Id
= 1。
您可以刪除模型中的Key屬性,但這可能會導致混淆,無論您在何處顯示這些結果,一旦您想要保存任何這些實體,您將獲得不可預測的結果。
您也可以嘗試AsNotracking()
但我強烈建議您反對,因為一旦您嘗試跟蹤或保存更改,您將遇到麻煩。 而是調整存儲過程以返回唯一行的唯一Id
。
您已將BookViewModel
類中的Id
定義為鍵,但您傳遞的是非唯一值:
將authorsBooks.Id
添加到SQL查詢中並將其傳遞給您的類中的[Key]
,並定義另一個字段以在查詢和類中顯示BookId
。
代碼如下:
public class BookViewModel
{
[Key]
public int Id { get; set; }
public string Author { get; set; }
public int BookId { get; set; }
public string Book { get; set; }
}
你最好像這樣編寫你的程序:
ALTER PROCEDURE [dbo].[GetBooksByAuthor2]
AS
SELECT
AB.Id AS id, B.Id AS bookId,
A.[Name] AS author, B.[Name] AS book
FROM
dbo.AuthorsBooks AS AB
INNER JOIN
dbo.Books B ON AB.BookId = B.Id
INNER JOIN
dbo.Authors A ON A.Id = AB.AuthorId
GO
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.