WCF RIA 服务在创建时就考虑到了这种情况。您可以在一个请求和一个数据库事务中轻松完成所有SubmitChanges
操作(取决于您的数据库和/或 ORM)。但是,如果您提供有关您的对象(POCO、EF 等)的更多信息,您将得到更好的答案。
也就是说,我将对服务器上定义的对象进行疯狂的猜测。
public class Product
{
[Key]
public int? ProductID { get; set; }
// ... more properties ...
[Association("Product-ProductDollars", "ProductID", "ProductID", IsForeignKey = false)]
[Include]
[Composition]
public ICollection<ProductDollar> ProductDollars { get; set; }
}
public class ProductDollar
{
[Key]
public int? ProductDollarID { get; set; }
public int? ProductID { get; set; }
// ... more properties ...
[Association("Product-ProductDollars", "ProductID", "ProductID", IsForeignKey = true)]
[Include]
public Product Product { get; set; }
}
你的 DomainService 看起来像
public class ProductDomainService : DomainService
{
public IQueryable<Product> GetProducts()
{
// Get data from the DB
}
public void InsertProduct(Product product)
{
// Insert the Product into the database
// Depending on how your objects get in the DB, the ProductID will be set
// and later returned to the client
}
public void InsertProductDollar(ProductDollar productDollar)
{
// Insert the ProductDollar in the DB
}
// Leaving out the Update and Delete methods
}
现在,在您的客户端上,您将拥有创建和添加这些实体的代码。
var context = new ProductDomainContext();
var product = new Product();
context.Products.Add(product);
product.ProductDollars.Add(new ProductDollar());
product.ProductDollars.Add(new ProductDollar());
context.SubmitChanges();
这导致向DomainService
. 但是,WCF RIA 将ChangeSet
包含 3 个插入的内容拆分为对您的DomainService
方法的 3 个调用:
InsertProduct(Product product)
InsertProductDollar(ProductDollar productDollar)
InsertProductDollar(ProductDollar productDollar)
如果您DomainService
在一个事务中执行所有插入,则您的 ORM 可以正确管理 ProductID。