簡體   English   中英

EF Core存儲過程不同的返回結果

[英]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在哪里?

您將BookViewModelId定義為Key ,因此,如果查詢Id1的'FirstAuthor',Entity Framework將首次緩存。 第二次遇到Id 1時,它使用當前上下文並根據緩存的值填充實體。

這里的問題是你的模棱兩可的模型。 FirstAuthorSecondAuthor如何都具有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM