簡體   English   中英

EF Core FromSQLRaw 和存儲過程插入數據

[英]EF Core FromSQLRaw and Stored Procedures to insert data

我有一個實體框架核心應用程序。 我有一個用於插入數據的存儲過程。 存儲過程在別處使用,所以我無法更改它。

當我調用它來創建一個條目時,它不起作用,因為Description列不是從存儲過程返回的。 因此,除非我將Description設置為[NotMapped]否則在調用FromSQLRaw時會出現錯誤。

但是,我不想使用[NotMapped]因為我可能會做類似的事情

dm.Offices.Where(o => o.Id > 10)

並且肯定[NotMapped]不會返回未映射的列。 那我能做什么?

using (var dm = new DatabaseModel())
{
    Office london = new Office { Description = "london" };
    var item = dm.Offices.FromSqlRaw("EXECUTE sp_addoffice {0}", london.Description);
}
public partial class Office
{
    [Key, Column("OfficeID")]
    public int ID { get; set; }
    public string Description { get; set; }
}

public partial class DatabaseModel : DbContext
{
    public virtual DbSet<Office> Offices { get; set; }
}
CREATE TABLE [dbo].[Offices]
(
    [OfficeID] [int] IDENTITY(1,1) NOT NULL primary key,
    [Description] [varchar](50) NULL
)

CREATE PROCEDURE [dbo].[sp_addoffice]
    @Description varchar(50)
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO offices (Description) 
    VALUES (@Description)

    SELECT SCOPE_IDENTITY() AS OfficeID
END

創建新班級

public class OfficeId
{
public int Id {get; set;}
}

將此類添加到您的 EF 上下文中:

public virtual DbSet<OfficeId> OfficeIds { get; set; }

   modelBuilder.Entity<OfficeId>(e =>
            {
                e.HasNoKey();
            });

在此之后只使用這個:

 var officeId = dm.OfficeIds.FromSqlRaw("EXECUTE sp_addoffice {0}", london.Description);

在此之后,您可以使用它,您可以驗證 officeId.Id 並使用您需要的任何方式。

您可以將 SQL 更改為在運行存儲過程后返回正確形狀的內容。 例如:

set nocount on;
declare @ids table(id int);

insert into @ids(id)
execute sp_addoffice {0};

select *
from offices 
where id = ( select top 1 id from @ids );

暫無
暫無

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

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