Silverlight 4 wcf ria сохранение нескольких записей

#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 методов:

  1. InsertProduct(Product product)
  2. InsertProductDollar(ProductDollar productDollar)
  3. InsertProductDollar(ProductDollar productDollar)

Если ваш DomainService выполняет все вставки в одной транзакции, идентификатор продукта может правильно управляться вашим ORM.

Комментарии:

1. о, где ты был этим утром!! я знал, что это должно быть проще, чем то, что я делал, ваш пример в значительной степени соответствует тому, что я делаю… я просто использую ef4 из коробки и создаю свой domainservice с помощью небольшого мастера Visual Studios, который появляется после добавления этого типа класса. потрясающе, спасибо вам ООООЧЕНЬ БОЛЬШОЕ!!!