我有一些遗留代码,我正在使用SubSonic重写以帮助未来的维护者。在大多数情况下,它都相对简单,因为所有内容都会进行存储过程调用。但是现在我对一些紧密耦合的ADO.NET代码有些困难。
代码依赖于SqlDataAdapter来决定何时调用INSERT或UPDATE存储过程,我理解。如何以SubSonic方式重写此代码?
public void SaveInvoice(InvoiceItems invoiceItems)
{
// extraneous code removed
// invoiceItems is a dataset
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "InvoiceItem_INSERT";
cmd.Connection = conn;
updateCmd.CommandType = CommandType.StoredProcedure;
updateCmd.CommandText = "InvoiceItem_UPDATE";
updateCmd.Connection = conn;
SqlCommandBuilder.DeriveParameters(cmd);
SqlCommandBuilder.DeriveParameters(updateCmd);
adapter.InsertCommand = cmd;
adapter.UpdateCommand = updateCmd;
adapter.Update(invoiceItems._InvoiceItemTable);
}
我是SubSonic的新手,所以感谢任何帮助。所有有用的答案都会高兴得赞成。
答案 0 :(得分:1)
使用SubSonic无法准确表示此类代码,因为自动插入/更新是由SqlDataAdapter.Update()
方法专门完成的。如果有某种方式,埋在SubSonic命名空间内的某个地方,我也想知道如何使用它!
如果您正在处理一个表(例如InvoiceItems
),您可以自己进行测试(这使用SubSonic自动生成的活动记录实现):
int key = InvoiceItems.ID; // not sure what your primary key identifier is called
InvoiceItem item = new InvoiceItem(key);
if (item != null)
{
SPs.InvoiceItem_UPDATE(param1, param2, etc).Execute();
}
else
{
SPs.InvoiceItem_INSERT(param1, param2, etc).Execute();
}
希望这能让你开始。
作为完全不相关的旁注,don't rely on the DeepSave()
method尝试保存多个表,因为它没有实现。我发现这很难......