[英].NET - EDMX/Auto-generated DbContext skips table-type parameters during procedure import
我有以下 SQL 過程並鍵入:
CREATE TYPE oprSlidingScaleProtocolEntrySet AS TABLE (
LowerValue DECIMAL(4,2) NOT NULL,
HigherValue DECIMAL(4,2),
UnitToDeliver DECIMAL(18,4) NOT NULL);
GO
CREATE PROCEDURE oprUpdateSlidingScaleProtocol
@PrescriptionId INT,
@newEntries oprSlidingScaleProtocolEntrySet READONLY
-- ...
使用實體框架的 EDMX,我應該能夠將過程作為 C# 函數導入,包括參數。 但這是 EDMX 提出的:
public virtual int oprUpdateSlidingScaleProtocol(Nullable<int> prescriptionId)
缺少newEntries
,也許導入數據類型參數超出了 EF 的能力? 我嘗試使用SqlCommand
類,但在運行時出現以下異常:
DataTable data = new DataTable("oprSlidingScaleProtocolEntrySet");
data.Columns.Add("LowerValue");
data.Columns.Add("HigherValue");
data.Columns.Add("UnitToDeliver");
// (populate table)
var sqlCmd = new SqlCommand("oprUpdateSlidingScaleProtocol", (SqlConnection)db.Database.Connection) {
CommandType = CommandType.StoredProcedure
};
sqlCmd.Parameters.AddWithValue("@prescriptionId", prescriptionId);
SqlParameter paramNewEntries = sqlCmd.Parameters.AddWithValue("@newEntries", data);
paramNewEntries.SqlDbType = SqlDbType.Structured;
sqlCmd.ExecuteNonQuery(); // RUNTIME ERROR: System.InvalidOperationException: 'ExecuteNonQuery requires an open and available Connection. The connection's current state is closed.'
這很奇怪,但我不想弄亂古怪的連接,所以我繼續使用自動生成的DbContext
使用的相同方法編寫自己的過程導入:
((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext.ExecuteFunction(
"oprUpdateSlidingScaleProtocol",
new ObjectParameter("prescriptionId", prescriptionId),
new ObjectParameter("newEntries", data)
);
但我得到以下異常:
System.InvalidOperationException: 'DbType'Object' 對 'newEntries' 對象上的 EntityParameter.DbType 屬性無效。
我的代碼中唯一的object
是用於定義“數據”的對象:
foreach (SlidingScaleProtocol.Entry entry in formData.GetEntries()) {
var row = data.NewRow();
row.ItemArray = new object[] {
entry.LowerValue,
entry.HigherValue,
entry.UnitToDeliver
};
}
但是我需要這些對象來創建我的行!
關於該主題的文檔非常有限,所以我不確定我還應該嘗試什么。 任何解決方案或想法?
您必須在運行 SqlCommands 之前打開連接。
db.Database.Connection.Open();
var sqlCmd = new SqlCommand("oprUpdateSlidingScaleProtocol", (SqlConnection)db.Database.Connection) {
CommandType = CommandType.StoredProcedure
};
當 DbContext 被處置時,EF 將為您關閉連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.