Làm cách nào để gọi Thủ tục lưu trữ trong Khung thực thể 6 (Mã đầu tiên)?


259

Tôi rất mới với Entity Framework 6 và tôi muốn thực hiện các thủ tục được lưu trữ trong dự án của mình. Tôi có một thủ tục được lưu trữ như sau:

ALTER PROCEDURE [dbo].[insert_department]
    @Name [varchar](100)
AS
BEGIN
    INSERT [dbo].[Departments]([Name])
    VALUES (@Name)

    DECLARE @DeptId int

    SELECT @DeptId = [DeptId]
    FROM [dbo].[Departments]
    WHERE @@ROWCOUNT > 0 AND [DeptId] = SCOPE_IDENTITY()

    SELECT t0.[DeptId]
    FROM [dbo].[Departments] AS t0
    WHERE @@ROWCOUNT > 0 AND t0.[DeptId] = @DeptId
END

Department lớp học:

public class Department
{
    public int DepartmentId { get; set; }       
    public string Name { get; set; }
}

modelBuilder 
.Entity<Department>() 
.MapToStoredProcedures(s => 
s.Update(u => u.HasName("modify_department") 
               .Parameter(b => b.Department, "department_id") 
               .Parameter(b => b.Name, "department_name")) 
 .Delete(d => d.HasName("delete_department") 
               .Parameter(b => b.DepartmentId, "department_id")) 
 .Insert(i => i.HasName("insert_department") 
               .Parameter(b => b.Name, "department_name")));

protected void btnSave_Click(object sender, EventArgs e)
{
    string department = txtDepartment.text.trim();

    // here I want to call the stored procedure to insert values
}

Vấn đề của tôi là: làm thế nào tôi có thể gọi thủ tục được lưu trữ và truyền tham số vào nó?


Tôi cũng muốn biết điều đó. Lý tưởng nhất là tôi bỏ qua EF hoàn toàn và chạy MỌI THỨ thông qua không có gì ngoài các thủ tục được lưu trữ. Tôi là một chuyên gia về SQL nhưng đã thấy EF rất bực bội khi thực hiện.
David Britz

Câu trả lời:


247

Bạn có thể gọi một thủ tục được lưu trữ trong DbContextlớp của bạn như sau.

this.Database.SqlQuery<YourEntityType>("storedProcedureName",params);

Nhưng nếu quy trình được lưu trữ của bạn trả về nhiều bộ kết quả dưới dạng mã mẫu của bạn, thì bạn có thể xem bài viết hữu ích này trên MSDN

Thủ tục lưu trữ với nhiều bộ kết quả


2
Cảm ơn @ Alborz. bạn có thể vui lòng cung cấp cho tôi một số liên kết liên quan đến việc triển khai nhiều Quy trình được lưu trữ trong Mã thực thể 6 Mã đầu tiên không. Tôi đã tìm kiếm khắp nơi trên web nhưng không nhận được bất kỳ bài viết nào trong đó tôi có thể gọi trực tiếp một thủ tục được lưu trữ cho các tham số IN và OUT. Cảm ơn thời gian quý báu của bạn.
Jaan

2
Bài viết này có thể hữu ích blog.msdn.com/b/diego/archive/2012/01/10/ trên
Alborz

8
Điều này dường như không hoạt động với các tham số. Dường như cần liệt kê rõ ràng các tham số như một phần của truy vấn.
Đánh dấu

6
Có, bạn cần phải xác định tham số là một phần của truy vấn - "storedProcedureName @param1, @param2". Ngoài ra các loại paramsSystem.Data.SqlClient.SqlParameter[].
Phong cách Oppa Gingham

6
this.Database.SqlQuery<YourEntityType>("storedProcedureName @param1", new System.Data.SqlClient.SqlParameter("@param1", YourParam));
Ppp

152

Tất cả bạn phải làm là tạo một đối tượng có cùng tên thuộc tính với kết quả được trả về bởi thủ tục được lưu trữ. Đối với các thủ tục được lưu trữ sau đây:

    CREATE PROCEDURE [dbo].[GetResultsForCampaign]  
    @ClientId int   
    AS
    BEGIN
    SET NOCOUNT ON;

    SELECT AgeGroup, Gender, Payout
    FROM IntegrationResult
    WHERE ClientId = @ClientId
    END

tạo một lớp giống như:

    public class ResultForCampaign
    {
        public string AgeGroup { get; set; }

        public string Gender { get; set; }

        public decimal Payout { get; set; }
    }

và sau đó gọi thủ tục bằng cách làm như sau:

    using(var context = new DatabaseContext())
    {
            var clientIdParameter = new SqlParameter("@ClientId", 4);

            var result = context.Database
                .SqlQuery<ResultForCampaign>("GetResultsForCampaign @ClientId", clientIdParameter)
                .ToList();
    }

Kết quả sẽ chứa một danh sách các ResultForCampaignđối tượng. Bạn có thể gọi SqlQuerybằng cách sử dụng nhiều tham số nếu cần.


2
Đối với một tình huống tắt, điều này sẽ làm việc tuyệt vời. Tôi thấy rằng định nghĩa SProc nên được kết hợp chặt chẽ với lớp kế thừa từ DBContext, thay vì trong "cánh đồng lúa mì" của sản phẩm.
GoldBishop

50

Tôi đã giải quyết nó với ExecuteSqlCommand

Đặt phương thức của riêng bạn như của tôi trong DbContext làm ví dụ của riêng bạn:

public void addmessage(<yourEntity> _msg)
{
    var date = new SqlParameter("@date", _msg.MDate);
    var subject = new SqlParameter("@subject", _msg.MSubject);
    var body = new SqlParameter("@body", _msg.MBody);
    var fid = new SqlParameter("@fid", _msg.FID);
    this.Database.ExecuteSqlCommand("exec messageinsert @Date , @Subject , @Body , @Fid", date,subject,body,fid);
}

để bạn có thể có một phương thức trong mã phía sau như thế này:

[WebMethod] //this method is static and i use web method because i call this method from client side
public static void AddMessage(string Date, string Subject, string Body, string Follower, string Department)
{
    try
    {
        using (DBContext reposit = new DBContext())
        {
            msge <yourEntity> Newmsg = new msge();
            Newmsg.MDate = Date;
            Newmsg.MSubject = Subject.Trim();
            Newmsg.MBody = Body.Trim();
            Newmsg.FID= 5;
            reposit.addmessage(Newmsg);
        }
    }
    catch (Exception)
    {
        throw;
    }
}

đây là SP của tôi:

Create PROCEDURE dbo.MessageInsert

    @Date nchar["size"],
    @Subject nchar["size"],
    @Body nchar["size"],
    @Fid int
AS
    insert into Msg (MDate,MSubject,MBody,FID) values (@Date,@Subject,@Body,@Fid)
    RETURN

hy vọng đã giúp bạn


2
Bạn cần chỉ định độ dài cho các tham số nchar cho quy trình được lưu trữ của mình - nếu không, chúng chỉ dài một ký tự, như bạn đã tìm thấy.
Dave W

@Mahdighafoorian Đây là một câu trả lời rất hữu ích, cảm ơn rất nhiều! :)
Komengem 6/03/2015

Cú pháp này không yêu cầu sửa đổi thứ tự các Thông số của SProc, nói cách khác là Định vị thông thường.
GoldBishop

21

Sử dụng ví dụ của bạn, đây là hai cách để thực hiện điều này:

1 - Sử dụng ánh xạ thủ tục lưu trữ

Lưu ý rằng mã này sẽ làm việc có hoặc không có ánh xạ. Nếu bạn tắt ánh xạ trên thực thể, EF sẽ tạo một câu lệnh insert + select.

protected void btnSave_Click(object sender, EventArgs e)
{
     using (var db = DepartmentContext() )
     {
        var department = new Department();

        department.Name = txtDepartment.text.trim();

        db.Departments.add(department);
        db.SaveChanges();

        // EF will populate department.DepartmentId
        int departmentID = department.DepartmentId;
     }
}

2 - Gọi thủ tục lưu trữ trực tiếp

protected void btnSave_Click(object sender, EventArgs e)
{
     using (var db = DepartmentContext() )
     {
        var name = new SqlParameter("@name", txtDepartment.text.trim());

        //to get this to work, you will need to change your select inside dbo.insert_department to include name in the resultset
        var department = db.Database.SqlQuery<Department>("dbo.insert_department @name", name).SingleOrDefault();

       //alternately, you can invoke SqlQuery on the DbSet itself:
       //var department = db.Departments.SqlQuery("dbo.insert_department @name", name).SingleOrDefault();

        int departmentID = department.DepartmentId;
     }
}

Tôi khuyên bạn nên sử dụng cách tiếp cận đầu tiên, vì bạn có thể làm việc trực tiếp với đối tượng bộ phận và không phải tạo ra một loạt các đối tượng SqlParameter.


3
Hãy cẩn thận, là ví dụ thứ hai mà sự thay đổi không được theo dõi bởi dbContext
edtr trốn

EDIT.Sử dụng System.Data.Entity.Dbset <TEntity> .SqlQuery (String, Object []) thay thế.
edtr đi

@edtruge Các dbContext xuất hiện để theo dõi sự thay đổi. Để kiểm tra, tôi đã xem db. <Dbset> .Count () trước và sau câu lệnh chèn. Trong cả hai phương pháp, số lượng tăng thêm một. Để hoàn thiện tôi đã thêm phương thức thay thế vào ví dụ.
Brian Vander Plaats

1
Tôi không thấy bất kỳ tài liệu tham khảo nào về thủ tục được lưu trữ trong ví dụ đầu tiên.
xr280xr

2
@ xr280xr, insert_depidor được tham chiếu trong biểu thức modelBuilder trong câu hỏi của OP. Đó là lợi thế để ánh xạ mọi thứ theo cách này bởi vì nó hoạt động hiệu quả theo cách tương tự như khi bạn cho phép EF tạo các câu lệnh chèn / cập nhật / xóa
Brian Vander Plaats

15

Bạn đang sử dụng MapToStoredProcedures()chỉ ra rằng bạn đang ánh xạ các thực thể của mình vào các thủ tục được lưu trữ, khi thực hiện việc này, bạn cần loại bỏ thực tế là có một thủ tục được lưu trữ và sử dụng contextnhư bình thường. Một cái gì đó như thế này ( được viết vào trình duyệt để không được kiểm tra )

using(MyContext context = new MyContext())
{
    Department department = new Department()
    {
        Name = txtDepartment.text.trim()
    };
    context.Set<Department>().Add(department);
}

Nếu tất cả những gì bạn thực sự cố gắng là gọi trực tiếp một thủ tục được lưu trữ thì hãy sử dụng SqlQuery


2
Cảm ơn qujck. Nhưng tôi muốn sử dụng thủ tục lưu trữ. Tôi đã đưa ra chỉ là một mã mẫu cho thuận tiện để hiểu.
Jaan

4
@Jaan - Đoạn mã trên sẽ sử dụng thủ tục được lưu trữ. Bạn có nghĩa là bạn muốn gọi trực tiếp các thủ tục được lưu trữ?
qujck

Đúng. Bạn có thể vui lòng cho tôi biết cách nào là tốt hơn. Gọi trực tiếp các thủ tục được lưu trữ hoặc mã trên bạn đã đưa ra?
Jaan

6
@Jaan sử dụng mã tôi đã hiển thị - ORM có nghĩa là để ẩn việc triển khai cơ bản - sử dụng mã ở trên đảm bảo rằng nó không quan trọng đối với phần còn lại của mã của bạn cho dù có thủ tục được lưu trữ hay không. Bạn thậm chí có thể thay đổi ánh xạ mô hình sang một thủ tục được lưu trữ khác hoặc không phải là một thủ tục được lưu trữ mà không thay đổi bất cứ điều gì khác.
qujck

4
@ Chazt3n Câu hỏi cho thấy các thủ tục được lưu trữ được cấu hình từ dòng .MapToStoredProcedures(s => . Một cuộc gọi Addnên giải quyết.Insert(i => i.HasName("insert_department")
qujck

12

Bây giờ bạn cũng có thể sử dụng một quy ước mà tôi đã tạo để cho phép gọi các thủ tục được lưu trữ (bao gồm các thủ tục được lưu trữ trả về nhiều kết quả), TVF và UDF vô hướng tự nhiên từ EF.

Cho đến khi Entity Framework 6.1 được phát hành các chức năng lưu trữ (tức là Hàm có giá trị bảng và Quy trình được lưu trữ) chỉ có thể được sử dụng trong EF khi thực hiện Cơ sở dữ liệu trước. Có một số cách giải quyết có thể gọi các chức năng lưu trữ trong ứng dụng Code First nhưng bạn vẫn không thể sử dụng TVF trong các truy vấn Linq, một trong những hạn chế lớn nhất. Trong EF 6.1, API ánh xạ đã được công khai, cùng với một số điều chỉnh bổ sung) cho phép sử dụng các chức năng lưu trữ trong các ứng dụng Code First của bạn.

Đọc thêm

Tôi đã cố gắng khá nhiều trong hai tuần qua và đây là - phiên bản beta của quy ước cho phép sử dụng các chức năng lưu trữ (tức là các thủ tục được lưu trữ, các hàm có giá trị bảng, v.v.) trong các ứng dụng sử dụng cách tiếp cận Code First và Entity Framework 6.1.1 ( hoặc mới hơn). Tôi rất hài lòng với các bản sửa lỗi và các tính năng mới có trong phiên bản này.

Đọc thêm .


Thực tế kể từ 4.0, bạn có thể thực thi SProcs mà không cần Model. Bạn cần phải thực thi các câu lệnh SQL thô thay vì thuộc tính đối tượng. Ngay cả với 6.1.x, bạn phải sử dụng SqlQuery <T> hoặc ExecuteSqlCommand để có được hiệu ứng tương tự.
GoldBishop

10
object[] xparams = {
            new SqlParameter("@ParametterWithNummvalue", DBNull.Value),
            new SqlParameter("@In_Parameter", "Value"),
            new SqlParameter("@Out_Parameter", SqlDbType.Int) {Direction = ParameterDirection.Output}};

        YourDbContext.Database.ExecuteSqlCommand("exec StoreProcedure_Name @ParametterWithNummvalue, @In_Parameter, @Out_Parameter", xparams);
        var ReturnValue = ((SqlParameter)params[2]).Value;  

1
params là một định danh sử dụng một tên khác.
Yogihosting

2
SaveChanges () ở đây không cần thiết. Các thay đổi được cam kết tại lệnh gọi ExecuteSqlCommand ().
Xavier Poinas

10

Điều này làm việc cho tôi bằng cách lấy lại dữ liệu từ một thủ tục được lưu trữ trong khi truyền tham số.

var param = new SqlParameter("@datetime", combinedTime);
var result = 
        _db.Database.SqlQuery<QAList>("dbo.GetQAListByDateTime @datetime", param).ToList();

_db là dbContext


9

Hãy xem liên kết này cho thấy cách hoạt động của ánh xạ của EF 6 với Thủ tục được lưu trữ để thực hiện Chèn, Cập nhật và Xóa: http://msdn.microsoft.com/en-us/data/dn468673

Thêm vào

Đây là một ví dụ tuyệt vời để gọi một thủ tục được lưu trữ từ Code First:

Hãy nói rằng bạn phải thực hiện Quy trình được lưu trữ với một tham số duy nhất và Quy trình được lưu trữ đó trả về một tập hợp dữ liệu khớp với các Quốc gia thực thể, vì vậy chúng tôi sẽ có điều này:

var countryIso = "AR"; //Argentina

var statesFromArgentina = context.Countries.SqlQuery(
                                      "dbo.GetStatesFromCountry @p0", countryIso
                                                    );

Bây giờ hãy nói rằng chúng tôi muốn thực hiện một thủ tục được lưu trữ khác với hai tham số:

var countryIso = "AR"; //Argentina
var stateIso = "RN"; //Río Negro

var citiesFromRioNegro = context.States.SqlQuery(
                            "dbo.GetCitiesFromState @p0, @p1", countryIso, stateIso
                          );

Lưu ý rằng chúng tôi đang sử dụng đặt tên dựa trên chỉ mục cho các tham số. Điều này là do Entity Framework sẽ bao bọc các tham số này dưới dạng các đối tượng DbParameter cho bạn để tránh bất kỳ vấn đề tiêm SQL nào.

Hy vọng ví dụ này giúp!


6
public IList<Models.StandardRecipeDetail> GetRequisitionDetailBySearchCriteria(Guid subGroupItemId, Guid groupItemId)
{
    var query = this.UnitOfWork.Context.Database.SqlQuery<Models.StandardRecipeDetail>("SP_GetRequisitionDetailBySearchCriteria @SubGroupItemId,@GroupItemId",
    new System.Data.SqlClient.SqlParameter("@SubGroupItemId", subGroupItemId),
    new System.Data.SqlClient.SqlParameter("@GroupItemId", groupItemId));
    return query.ToList();
}

4

Nó làm việc cho tôi tại mã đầu tiên. Nó trả về một danh sách với thuộc tính phù hợp của mô hình xem (StudentCh CHƯƠNGCompletionViewModel)

var studentIdParameter = new SqlParameter
{
     ParameterName = "studentId",
     Direction = ParameterDirection.Input,
     SqlDbType = SqlDbType.BigInt,
     Value = studentId
 };

 var results = Context.Database.SqlQuery<StudentChapterCompletionViewModel>(
                "exec dbo.sp_StudentComplettion @studentId",
                 studentIdParameter
                ).ToList();

Cập nhật cho bối cảnh

Ngữ cảnh là thể hiện của lớp kế thừa DbContext như bên dưới.

public class ApplicationDbContext : DbContext
{
    public DbSet<City> City { get; set; }
}

var Context = new  ApplicationDbContext();

Xin chào, tôi không thể tìm thấy Context.Database.SqlQuery <Model> này, nơi tôi có thể thực hiện Context.TableName.SqlQuery (ProcName) này. đó là vấn đề khiến tôi gặp phải
Marshall

@Marshall, có thể bạn đang sử dụng cơ sở dữ liệu thiết kế đầu tiên. xin vui lòng kiểm tra liên kết này stackoverflow.com/questions/11792018/...
reza.cse08

1

Hành khách không suy nghĩ có một dự án cho phép trả về nhiều tập kết quả từ một Proc được lưu trữ bằng cách sử dụng khung thực thể. Một trong những ví dụ của anh ấy dưới đây ....

using (testentities te = new testentities())
{
    //-------------------------------------------------------------
    // Simple stored proc
    //-------------------------------------------------------------
    var parms1 = new testone() { inparm = "abcd" };
    var results1 = te.CallStoredProc<testone>(te.testoneproc, parms1);
    var r1 = results1.ToList<TestOneResultSet>();
}

1

Bạn có thể truyền tham số đến sp_GetByIdvà tìm nạp kết quả trong ToList()hoặcFirstOrDefault();

var param  = new SqlParameter("@id", 106);
var result = dbContext
               .Database
               .SqlQuery<Category>("dbo.sp_GetById @id", param)
               .FirstOrDefault();

0

nếu bạn muốn chuyển tham số bảng vào thủ tục được lưu trữ, bạn phải đặt thuộc tính TypeName cho thông số bảng của mình.

SqlParameter codesParam = new SqlParameter(CODES_PARAM, SqlDbType.Structured);
            SqlParameter factoriesParam = new SqlParameter(FACTORIES_PARAM, SqlDbType.Structured);

            codesParam.Value = tbCodes;
            codesParam.TypeName = "[dbo].[MES_CodesType]";
            factoriesParam.Value = tbfactories;
            factoriesParam.TypeName = "[dbo].[MES_FactoriesType]";


            var list = _context.Database.SqlQuery<MESGoodsRemain>($"{SP_NAME} {CODES_PARAM}, {FACTORIES_PARAM}"
                , new SqlParameter[] {
                   codesParam,
                   factoriesParam
                }
                ).ToList();

0

Đây là thứ mà EF (DB đầu tiên) tạo ra trong lớp DbContext:

public ObjectResult<int> Insert_Department(string department)
{
    var departmentParameter = new ObjectParameter("department", department);

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<int>("insert_department", departmentParameter);
}

0

Khi EDMX tạo thời gian này nếu bạn chọn thủ tục được lưu trữ trong tùy chọn chọn bảng thì chỉ cần gọi cửa hàng được xử lý bằng tên thủ tục ...

var num1 = 1; 
var num2 = 2; 

var result = context.proc_name(num1,num2).tolist();// list or single you get here.. using same thing you can call insert,update or delete procedured.

0

Tôi thấy rằng việc gọi các thủ tục được lưu trữ trong cách tiếp cận Code First không thuận tiện. Tôi thích sử dụng Dapperthay thế

Đoạn mã sau được viết với Entity Framework:

var clientIdParameter = new SqlParameter("@ClientId", 4);

var result = context.Database
.SqlQuery<ResultForCampaign>("GetResultsForCampaign @ClientId", clientIdParameter)
.ToList();

Đoạn mã sau được viết với Dapper:

return Database.Connection.Query<ResultForCampaign>(
            "GetResultsForCampaign ",
            new
            {
                ClientId = 4
            },
            commandType: CommandType.StoredProcedure);

Tôi tin rằng đoạn mã thứ hai đơn giản hơn để hiểu.


0
public static string ToSqlParamsString(this IDictionary<string, string> dict)
        {
            string result = string.Empty;
            foreach (var kvp in dict)
            {
                result += $"@{kvp.Key}='{kvp.Value}',";
            }
            return result.Trim(',', ' ');
        }

public static List<T> RunSproc<T>(string sprocName, IDictionary<string, string> parameters)
        {
            string command = $"exec {sprocName} {parameters.ToSqlParamsString()}";
            return Context.Database.SqlQuery<T>(command).ToList();
        }

0

Không có gì phải làm ... khi bạn đang tạo dbcontext cho mã, cách tiếp cận đầu tiên khởi tạo không gian tên bên dưới khu vực API thông thạo tạo danh sách sp và sử dụng nó ở một nơi khác mà bạn muốn.

public partial class JobScheduleSmsEntities : DbContext
{
    public JobScheduleSmsEntities()
        : base("name=JobScheduleSmsEntities")
    {
        Database.SetInitializer<JobScheduleSmsEntities>(new CreateDatabaseIfNotExists<JobScheduleSmsEntities>());
    }

    public virtual DbSet<Customer> Customers { get; set; }
    public virtual DbSet<ReachargeDetail> ReachargeDetails { get; set; }
    public virtual DbSet<RoleMaster> RoleMasters { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //modelBuilder.Types().Configure(t => t.MapToStoredProcedures());

        //modelBuilder.Entity<RoleMaster>()
        //     .HasMany(e => e.Customers)
        //     .WithRequired(e => e.RoleMaster)
        //     .HasForeignKey(e => e.RoleID)
        //     .WillCascadeOnDelete(false);
    }
    public virtual List<Sp_CustomerDetails02> Sp_CustomerDetails()
    {
        //return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Sp_CustomerDetails02>("Sp_CustomerDetails");
        //  this.Database.SqlQuery<Sp_CustomerDetails02>("Sp_CustomerDetails");
        using (JobScheduleSmsEntities db = new JobScheduleSmsEntities())
        {
           return db.Database.SqlQuery<Sp_CustomerDetails02>("Sp_CustomerDetails").ToList();

        }

    }

}

}

public partial class Sp_CustomerDetails02
{
    public long? ID { get; set; }
    public string Name { get; set; }
    public string CustomerID { get; set; }
    public long? CustID { get; set; }
    public long? Customer_ID { get; set; }
    public decimal? Amount { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }
    public int? CountDay { get; set; }
    public int? EndDateCountDay { get; set; }
    public DateTime? RenewDate { get; set; }
    public bool? IsSMS { get; set; }
    public bool? IsActive { get; set; }
    public string Contact { get; set; }
}

0

Sử dụng mã khung MySql và Entity trước tiên Cách tiếp cận:

public class Vw_EMIcount
{
    public int EmiCount { get; set; }
    public string Satus { get; set; }
}

var result = context.Database.SqlQuery<Vw_EMIcount>("call EMIStatus('2018-3-01' ,'2019-05-30')").ToList();

0

Tạo thủ tục trong MYsql.

delimiter //
create procedure SP_Dasboarddata(fromdate date, todate date)
begin
select count(Id) as count,date,status,sum(amount) as amount from 
details
where (Emidate between fromdate and todate)
group by date ,status;
END;
//

Tạo lớp chứa các giá trị tập kết quả trả về thủ tục được lưu trữ

[Table("SP_reslutclass")]
public  class SP_reslutclass
{
    [Key]
    public int emicount { get; set; }
    public DateTime Emidate { get; set; }
    public int ? Emistatus { get; set; }
    public int emiamount { get; set; }

}

Thêm lớp trong Dbcontext

  public  class ABCDbContext:DbContext
{
    public ABCDbContext(DbContextOptions<ABCDbContext> options)
       : base(options)
    {

    }

 public DbSet<SP_reslutclass> SP_reslutclass { get; set; }
}

Gọi thực thể trong kho lưu trữ

   var counts = _Dbcontext.SP_reslutclass.FromSql("call SP_Dasboarddata 
                    ('2019-12-03','2019-12-31')").ToList();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.