簡體   English   中英

在實體框架中使用存儲過程

[英]Use a stored procedure in entity framework

我有一個模型優先的EF模型。 我剛剛導入了第一個存儲過程: cpas_POIDVendorProjectDate

我將其導入為函數。 它具有三個輸入參數: @ProjectID(int)@VendorID(int)@Workdate(datetime) ,並返回@POID(int)

這是SQL代碼:

 CREATE PROCEDURE [dbo].[cpas_POIDVendorProjectDate]
    @VendorID int,
    @ProjectID int,
    @WorkDate datetime,
    @PO_ID int OUTPUT
 AS
 BEGIN
    SET NOCOUNT ON;

    DECLARE @RowCount int;

       SELECT @PO_ID = ID FROM tblPO WHERE 
        VendorID = @VendorID
        AND ExpirationDate >= @WorkDate
        AND (ProjectID IS NULL OR ProjectID = @ProjectID)
        AND CapitalExpense = (
          SELECT CapitalExpense FROM tblProjects WHERE ID=@ProjectID)
        AND GroupCode in (1,3,5);

     SET @RowCount = @@RowCount;

     IF (@RowCount != 1)
       SET @PO_ID = -1*@RowCount;

END

我在c#程序中按如下方式調用它:

context.cpas_POIDVendorProjectDate(
    currVendorID, currProjectID, currWorkDate, currPOID);

Intellisense說我對“上下文”的使用是錯誤的……這是一個“變量”,我將其用作“方法”。

另外, currPOID被拒絕,因為它正在尋找system.data.objects.OjbectParameter ,而不是int Intellisense對函數名稱和其他參數感到滿意(奇怪的是...)

我在這里做錯了什么?

如果沒有其他效果,您可以始終這樣做:

using(var context = new MyDataContext())
{
    using(var cmd = context.Database.Connection.CreateCommand())
    {
        cmd.CommandText = "cpas_POIDVendorProjectDate";
        cmd.CommandType = CommandType.StoredProcedure;
        //if the stored proc accepts params, here is where you pass them in
        cmd.Parameters.Add(new SqlParameter("VendorId", 10));
        cmd.Parameters.Add(new SqlParameter("ProjectId", 12));
        cmd.Parameters.Add(new SqlParameter("WorkDate", DateTimw.Now));
        var poid = (int)cmd.ExecuteScalar();
    }
}

如果您想要一種面向對象的方式,那么Mindless passenger有一個項目可以讓您從這樣的實體框架中調用存儲的proc。

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>();
}

...並且我正在開發一個存儲過程框架在這里 ),您可以像下面顯示的一種測試方法中那樣調用它...

[TestClass]
public class TenantDataBasedTests : BaseIntegrationTest
{
    [TestMethod]
    public void GetTenantForName_ReturnsOneRecord()
    {
        // ARRANGE
        const int expectedCount = 1;
        const string expectedName = "Me";

        // Build the paraemeters object
        var parameters = new GetTenantForTenantNameParameters
        {
            TenantName = expectedName
        };

        // get an instance of the stored procedure passing the parameters
        var procedure = new GetTenantForTenantNameProcedure(parameters);

        // Initialise the procedure name and schema from procedure attributes
        procedure.InitializeFromAttributes();

        // Add some tenants to context so we have something for the procedure to return!
        AddTenentsToContext(Context);

        // ACT
        // Get the results by calling the stored procedure from the context extention method 
        var results = Context.ExecuteStoredProcedure(procedure);

        // ASSERT
        Assert.AreEqual(expectedCount, results.Count);
    }
}

internal class GetTenantForTenantNameParameters
{
    [Name("TenantName")]
    [Size(100)]
    [ParameterDbType(SqlDbType.VarChar)]
    public string TenantName { get; set; }
}

[Schema("app")]
[Name("Tenant_GetForTenantName")]
internal class GetTenantForTenantNameProcedure
    : StoredProcedureBase<TenantResultRow, GetTenantForTenantNameParameters>
{
    public GetTenantForTenantNameProcedure(
        GetTenantForTenantNameParameters parameters)
        : base(parameters)
    {
    }
}

這兩種方法中的任何一種是否有用?

暫無
暫無

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

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