簡體   English   中英

.NET - EDMX/自動生成的 DbContext 在過程導入期間跳過表類型參數

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

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