#entity-framework #silverlight-4.0 #mvvm-light #wcf-ria-services #submitchanges
#entity-framework #silverlight-4.0 #mvvm-light #wcf-ria-сервисы #подстановки
Вопрос:
Хорошо, я почти уверен, что это просто вопрос обучения… но у меня очень нормализованная база данных, с которой я работаю, поэтому, когда я сохраняю в tbl своего продукта, у меня также есть таблица productDollar и так далее… мой вопрос в silverlight все асинхронно, так как мне сохранить продукт, вернуть его новый идентификатор и использовать его в качестве productDollar.ProductID fk
пока что при других моих сохранениях я просто использую submitOperation в обратном вызове submitchanges и там я проверяю iscompleted и делаю следующее сохранение и так далее… и соедините их вот так.
но у меня есть 500 продуктов, которые мне нужно сохранить (все сразу), поэтому выполнение foreach вокруг моего объекта product не сработает из-за замечательной асинхронности, так чего же мне не хватает??? любая помощь или указания были бы весьма признательны
Ответ №1:
Службы 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 вставки, на 3 вызова ваших DomainService
методов:
InsertProduct(Product product)
InsertProductDollar(ProductDollar productDollar)
InsertProductDollar(ProductDollar productDollar)
Если ваш DomainService
выполняет все вставки в одной транзакции, идентификатор продукта может правильно управляться вашим ORM.
Комментарии:
1. о, где ты был этим утром!! я знал, что это должно быть проще, чем то, что я делал, ваш пример в значительной степени соответствует тому, что я делаю… я просто использую ef4 из коробки и создаю свой domainservice с помощью небольшого мастера Visual Studios, который появляется после добавления этого типа класса. потрясающе, спасибо вам ООООЧЕНЬ БОЛЬШОЕ!!!