簡體   English   中英

如何在實體框架中調用帶有聯接的存儲過程?

[英]How to call Stored Procedure with Joins in Entity framework?

.Net 核心 3.1

這是我的桌子

我不允許在其中添加任何外鍵或新關系。 我制作了一個將其他 3 個表連接到 Ordering_Policy 表的存儲過程。

create procedure spOrderingPolicy
as
    select op.Id, op.Tyre_Grade, op.Tyre_Group, tb.Tyre_Brand, ss.Status, tc.Cosmetic
    from [dbo].[Ordering_Policy] as op

    left join [dbo].[Tyre_Brand] as tb
    on op.Tyre_Brand_Id = tb.Id
    left join [dbo].[Shearography_Status] as ss
    on op.Shearography_Id = ss.Id
    left join [dbo].[Tyre_Cosmetic] as tc
    on op.Cosmetic_Id = tc.Id
go

結果結果如預期:

所以我嘗試調用該程序:

public IEnumerable<OrderingPolicy> GetOrder()
{
    using (Ordering_PolicyContext context = new Ordering_PolicyContext())
    {
        var order = context.OrderingPolicies.FromSqlRaw<OrderingPolicy>("spOrderingPolicy").ToList();
        return order;
    }
}

但它忽略了 Ordering_Policy 中沒有的任何內容:結果

如何調用該過程並顯示查詢中的所有數據?

編輯:這是用於 OrderingPolicy 的 class

namespace Ordering_Policy.Models
{
    public partial class OrderingPolicy
    {
        public int Id { get; set; }
        public string TyreGrade { get; set; }
        public int? TyreGroup { get; set; }
        public int? ShearographyId { get; set; }
        public string CasingLife { get; set; }
        public string Variance { get; set; }
        public string ColorCode { get; set; }
        public string Injury { get; set; }
        public int? MaxCrownPatch { get; set; }
        public int? MaxShoulder { get; set; }
        public int? Age { get; set; }
        public int? CosmeticId { get; set; }
        public int? TyreBrandId { get; set; }
    }
}

您需要創建一個與存儲過程返回的結果集匹配的無鍵實體類型,並在該 DbSet 而不是OrderingPolicy OrderingPolicyEx.FromSqlRaw

您應該使用INNER Join而不是 left Join:

這是我的演示,帶有您的實體類(有點簡化):

CREATE PROCEDURE [dbo].[spOrderingPolicy]  
as

select op.Id, op.TyreGrade, 
op.TyreGroup,op.CosmeticId,op.ShearographyId,op.TyreBrandId, tb.Brand, ss.status, 
tc.cosmetic
from dbo.OrderingPolicy as op

INNER JOIN [dbo].[Tyre_Brand] as tb
on op.TyreBrandId = tb.Id
INNER JOIN [dbo].[Shearography_Status] as ss
on op.ShearographyId = ss.Id
INNER JOIN [dbo].[Tyre_Cosmetic] as tc
on op.CosmeticId = tc.Id
Go

結果:只顯示匹配的行

在此處輸入圖像描述

我終於找到了解決方案:制作新的 class 和上下文,僅用於調用存儲過程中的列

Class:

public partial class Tyre_Detail
{
    public int? Id { get; set; }
    public string Tyre_Grade { get; set; }
    public int? Tyre_Group { get; set; }
    public string Tyre_Brand { get; set; }
    public string Status { get; set; }
    public string Cosmetic { get; set; }
}

數據必須具有與存儲過程中的列完全相同的名稱。 這個 class 中沒有鍵,所以數據類型,在這種情況下是int需要有問號。

然后為 class 創建上下文文件:

modelBuilder.Entity<Tyre_Detail>(entity =>
{
     entity.HasNoKey();

     entity.Property(e => e.Id);
     entity.Property(e => e.Tyre_Grade);
     entity.Property(e => e.Tyre_Group);
     entity.Property(e => e.Tyre_Brand);
     entity.Property(e => e.Status);
     entity.Property(e => e.Cosmetic);
     });

由於這是無密鑰實體,因此 .HasNoKey() 是必不可少的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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