我们有一个使用 WCF 数据服务的 Silverlight 应用程序。我们要添加日志功能:当生成新行时,该新行的主键也记录在日志表中。行生成和日志记录应该发生在同一个事务中。主键是通过数据库生成的(使用 IDENTITY 关键字)。
最好用一个例子来说明这一点。在这里,我创建了一个新的Customer行,并在同一个事务中将 Customer 的主键写入AuditLog行。此示例使用胖客户端和实体框架:
using (var ts = new TransactionScope())
{
AuditTestEntities entities = new AuditTestEntities();
Customer c = new Customer();
c.CustomerName = "Acme Pty Ltd";
entities.AddToCustomer(c);
Debug.Assert(c.CustomerID == 0);
entities.SaveChanges();
// The EntityFramework automatically updated the customer object
// with the newly generated key
Debug.Assert(c.CustomerID != 0);
AuditLog al = new AuditLog();
al.EntryDateTime = DateTime.Now;
al.Description = string.Format("Created customer with customer id {0}", c.CustomerID);
entities.AddToAuditLog(al);
entities.SaveChanges();
ts.Complete();
}
使用 Entity Framework 开发胖客户端时,这是一个小问题。
但是,使用 Silverlight 和 ADO.NET 数据服务:
- SaveChanges 只能异步调用
- 我不确定 TransactionScope 是否可用
- 我不确定生成的密钥是否可以反映在客户端编辑:根据Alex James的说法,它们确实反映在客户端
那么,这甚至可能吗?