. net - EDMX/自动生成的DbContext在过程导入期间跳过表类型参数



我有以下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)
);

但是我得到了下面的异常:

系统。InvalidOperationException: ' DbType 'Object'对EntityParameter无效。'newEntries'对象的DbType属性。'

我的代码中唯一的objects是用于定义"data"的那些:

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

EF将在DbContext被dispose时为您关闭连接。

最新更新