我有以下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属性。'
我的代码中唯一的object
s是用于定义"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时为您关闭连接。