Silverlight 4 wcf ria Сохранение нескольких записей - PullRequest
0 голосов
/ 17 мая 2011

Хорошо, я почти уверен, что это просто вопрос обучения ... но у меня есть очень нормализованная БД, с которой я работаю, поэтому, когда я сохраняю в свой продукт, у меня также есть таблица productDollar и т. Д.. мой вопрос в Silverlight, все асинхронно, так как я могу сохранить продукт, получить его новый идентификатор и использовать его как productDollar.productID fk

, пока с другими сохранениями я просто использую submitOperation в обратном вызовеиз подтверждений и там я проверяю, завершен ли он, и делаю следующее сохранение и так далее ... и объединяю их в цепочку, как это.

, но у меня есть 500 продуктов, которые мне нужно сохранить (все сразу), делая такforeach вокруг моего объекта продукта не будет работать из-за замечательной асинхронности. Так чего мне не хватает ???любая помощь или указатели будут с благодарностью

1 Ответ

3 голосов
/ 18 мая 2011

WCF RIA Services помнил эту ситуацию при создании.Вы можете легко сделать все это за один 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 выполняет все вставки в одной транзакции, ProductID может правильно управляться вашим ORM.

...