[英]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.