Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Updating/Inserting multiple rows using jQuery and OData (WCF Data Services)

I have three tables, Template, Fields and TemplateFields. TemplateFields holds the selected fields for each template. I need to update TemplateFields when the user is finished selecting the fields. The only way I can see to do this is by deleting all the TemplateFields for that Template and then add them one by one in separate requests. This is really bad because there is not transaction to fall back onto and there will also be MANY requests.

Is there a way of adding multiple 'objects' at once using WCF Data Services? I can then use an Interceptor to update the database.

like image 845
Pieter Avatar asked Nov 06 '22 13:11

Pieter


1 Answers

See this article "Adding/Creating data to OData/Wcf Data Service batch explained":

http://franssenden.wordpress.com/2010/06/18/addingcreating-data-to-odatawcf-data-service-batch-explained/

Update:

The article has moved to:
http://www.fcodings.com/2010/06/18/addingcreating-data-to-odatawcf-data-service-batch-explained/

Quoting from the post as per request in comments

  1. Service

    using System.Collections.Generic;
    using System.Data.Services;
    using System.Linq;
    using System.ServiceModel.Web;
    using System.Web;
    using System.Linq.Expressions;
    using System.Data.Services.Common;
    
    namespace TestAdventureWorksDataServices
    {
        public class AdventureService : DataService<AdventureWorksEntities>
        {
            // This method is called only once to initialize service-wide policies.
            public static void InitializeService(DataServiceConfiguration config)
            {
                // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
                // Examples:
                config.SetEntitySetAccessRule("*", EntitySetRights.All);
                // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
                config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
                config.UseVerboseErrors = false;
            }
    
            protected override void HandleException(HandleExceptionArgs args)
            {
                throw new DataServiceException(args.Exception.InnerException.Message, args.Exception);
            }
    
        }
    }
    
  2. Client

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.Services.Client;
    
    namespace Client
    {
        using Client.AdventureWorksServiceReference;
    
        class Program
        {
            private static AdventureWorksEntities _context = null;
    
            static void Main(string[] args)
            {
                _context = new AdventureWorksEntities(new Uri("http://ipv4.fiddler:51824/AdventureService.svc"));
    
                var product1 = Product.CreateProduct(0, "My Test Product 1", "1234", true, true, 1, 1, 100, 200, 3,
                DateTime.Now, new Guid("E29C16AE-908A-4F53-8E19-DC2CFDDF08A0"), DateTime.Now);
    
                var product2 = Product.CreateProduct(0, "My Test Product 2", "5678", true, true, 1, 1, 200, 300, 3,
                DateTime.Now, new Guid("1B9689D6-CCFF-40C3-AA0F-1AC3C5951738"), DateTime.Now);
    
                var product3 = Product.CreateProduct(0, "My Test Product 3", "9876", true, true, 1, 1, 300, 400, 3,
                DateTime.Now, new Guid("{0B677FB4-890E-4FAF-AD6A-7477D5703E6E}"), DateTime.Now);
    
                var collection = new DataServiceCollection<Product>(_context);
                collection.Add(product1);
                collection.Add(product2);
                collection.Add(product3);
                _context.SaveChanges();
    
                Console.Read();
    
                //remove products to omit unique constraint next time running this app:
                collection.Remove(product1);
                collection.Remove(product2);
                collection.Remove(product3);
                _context.SaveChanges(SaveChangesOptions.Batch);
    
                Console.WriteLine("Deleted. Sorry, changed my mind!");
                Console.Read();
    
            }
        }
    }
    

Where the following is the most important piece in the client code:

_context.SaveChanges(SaveChangesOptions.Batch);
like image 170
Meligy Avatar answered Nov 12 '22 20:11

Meligy