OData v4 Client Code Generator

Microsoft Free

An item template that simplifies the process of accessing OData v4 services by generating C# and VB.Net client-side proxy classes.

Microsoft
(1) Review
Visual Studio
2013, 2012, 2010
Download (21,618)
8/27/2015
2.3.0
View
E-mail Twitter del.icio.us Digg Facebook
Add to favorites
Description
Reviews (1)
Q and A (22)
Sign in to write a review
Sort by:

by ImGonaRot | November 26 2014

Great start but falls short in a few areas such as authentication and function / action calls.

Sign in to start a discussion


  • Bug when returning string array
    2 Posts | Last post Mon 3:12 PM
    • Let's assume you have a odata service that returns a string array.
      If you try to run the OData client template against the OData service that returns the string array then the generated client code will have a have a namespace of "System" and a class of "String[]".
      
      This will of course break all code since it is using the "System" namespace.
      
      'Generation date: 7/31/2014 4:56:19 PM
      Namespace System
          '''<summary>
          '''There are no comments for String[] in the schema.
          '''</summary>
      	<Global.Microsoft.OData.Client.OriginalNameAttribute("String[]")>  _
          Partial Public Class String[]
              Implements Global.System.ComponentModel.INotifyPropertyChanged
              ''' <summary>
              ''' This event is raised when the value of the property is changed
              ''' </summary>
              <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.OData.Client.Design.T4", "2.0.0")>  _
              Public Event PropertyChanged As Global.System.ComponentModel.PropertyChangedEventHandler Implements Global.System.ComponentModel.INotifyPropertyChanged.PropertyChanged
              ''' <summary>
              ''' The value of the property is changed
              ''' </summary>
              ''' <param name="property">property name</param>
              <Global.System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.OData.Client.Design.T4", "2.0.0")>  _
              Protected Overridable Sub OnPropertyChanged(ByVal [property] As String)
                  If (Not (Me.PropertyChangedEvent) Is Nothing) Then
                      RaiseEvent PropertyChanged(Me, New Global.System.ComponentModel.PropertyChangedEventArgs([property]))
                  End If
              End Sub
          End Class
          ''' <summary>
          ''' Class containing all extension methods
          ''' </summary>
          Public Module ExtensionMethods
          End Module
      End Namespace
    • Try using ReturnsCollection<string> rather than Returns<string[]>
       EntityTypeConfiguration<MyType> myTypeConfiguration = builder.EntityType<MyType>();
      ActionConfiguration myAction = myTypeConfiguration.Action("MyActionName").ReturnsCollection<string>();
      
      Hope that helps.
      
  • Open Source
    2 Posts | Last post August 18, 2015
    • Is this project open source?  I can't seem to find it in the OData repos on github https://github.com/OData.  Thanks.
    • Repo: odata.net - https://github.com/OData/odata.net/tree/master/src/CodeGen
  • Any updates for VS2015?
    8 Posts | Last post August 15, 2015
    • Is there an ETA on when this will be available on VS2015?
    • Ditto!
    • +1
    • +1
    • +1
    • +1
    • It seems that an update is in the works  https://github.com/OData/odata.net/issues/234
    • meanwhile, you can download the vsix, rename extension to zip, unzip, open extension.vsixmanifest, add 
            <VisualStudio Version="14.0">
              <Edition>Pro</Edition>
            </VisualStudio>	  
      
      under <SupportedProducts>, save, re-zip, change extension back to vsix and install.
  • Error with Nullable<int>
    2 Posts | Last post July 15, 2015
    • I just upgraded my OData Service and the Client Code Generator, and now some of my FOREIGN KEY fields are nullable.  
      
      Here are a few code snippets showing you want I mean:
      
      From SQL Schema (Merchants Table):
      
      [CoBrandId] INT NOT NULL,
      CONSTRAINT [FK_Merchants_CoBrands] FOREIGN KEY ([CoBrandId]) REFERENCES [CoBrands]([CoBrandId]),
      
      From Entity Class (Merchant):
      
      public int CoBrandId { get; set; }
      public virtual CoBrand CoBrand { get; set; }
      
      From OData generated Metadata:
      
      <EntityType Name="Merchant">
      	<Key>
      		<PropertyRef Name="MerchantId"/>
      	</Key>
      	<Property Name="MerchantId" Type="Edm.Int32" Nullable="false"/>
      	...
      	<Property Name="IsActive" Type="Edm.Boolean" Nullable="false"/>
      	...
      	<Property Name="CoBrandId" Type="Edm.Int32"/>
      	...
      	<NavigationProperty Name="CoBrand" Type="Entities.CoBrand">
      		<ReferentialConstraint 
                            Property="CoBrandId" 
                            ReferencedProperty="CoBrandId"/>
      	</NavigationProperty>
      </EntityType>
      
      From Client Code Generator:
      
              /// <summary>
              /// There are no comments for Property CoBrandId in the schema.
              /// </summary>
              [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.OData.Client.Design.T4", "2.1.0")]
              [global::Microsoft.OData.Client.OriginalNameAttribute("CoBrandId")]
              public global::System.Nullable<int> CoBrandId
              {
                  get
                  {
                      return this._CoBrandId;
                  }
                  set
                  {
                      this.OnCoBrandIdChanging(value);
                      this._CoBrandId = value;
                      this.OnCoBrandIdChanged();
                      this.OnPropertyChanged("CoBrandId");
                  }
              }
              [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.OData.Client.Design.T4", "2.1.0")]
              private global::System.Nullable<int> _CoBrandId;
              partial void OnCoBrandIdChanging(global::System.Nullable<int> value);
      
      
      
    • I was experiencing the same issue. I'm using Entity Framework and have a Computer class which has a ClientID property and a matching Client virtual property (navigation property). The OData generated metadata didn't explicitly state that the ClientID wasn't nullable, so the code generator made it nullable.
      The fix that worked for me was to add the [Required] attribute to the Client navigation property on the Computer class.
  • Visual Studio Express Install
    3 Posts | Last post June 18, 2015
    • I downloaded and ran the VSix install by clicking on the download.
      
      I said that it installed but is not visible as an add template.
      
      Is there a way to install on the Visual Studio express 2013. and web 2013.
      
      Thanks 
    • Same here I installed via nuget package manager. But still i can'r see the template.
      Please help.
    • Same here. Is this resolved yet?
  • Problem With String Collection Parameter
    1 Posts | Last post April 01, 2015
    • I have an OData Controller that has a function that has a parameter that is a string array. The OData Client T4 Template ver. 2.2.0 tries to create a partial class for String[], which will not compile:
      
          /// <summary>
          /// There are no comments for String[] in the schema.
          /// </summary>
          [global::Microsoft.OData.Client.OriginalNameAttribute("String[]")]
          public partial class String[] : global::System.ComponentModel.INotifyPropertyChanged
          {
          ...
      
      Is there something I can do to get the T4 Template to work, or is this a bug with the template?
  • It dosn't work with ASP.NET WebAPI OData.
    1 Posts | Last post March 13, 2015
    • I used this code generator with ASP.NET WebAPI OData. But it dosn't work.
      
      ASP.NET WebAPI generates edmx.
      <edmx:Edmx ...>
         ....
      </edmx:Edmx>
      
      OData v4 Client Code Generator can't parse this edmx. why??
  • Filtering a composable function result by the entity id property
    2 Posts | Last post February 16, 2015
    • I'm using a Web API OData service and have a client that uses the generator. Suppose we have an unbound and composable function which has the following metadata:
      
            <Function Name=""FunctionReturnsIQueryable"" IsComposable=""true"">
              <ReturnType Type=""Collection(WebTestsServer.Domain.ActionMethodsRoutingTests.PrimitiveEntity)"" />
            </Function>
      
      Here PrimitiveEntity is an entity. When I try to run the follwing query:
      
      (DataServiceQuery<PrimitiveEntity>)Client.FunctionReturnsIQueryable().Where(x => x.Id == 1).Execute();
      
      I can see in Fiddler the GET request for this url: http://localhost:59663/FunctionReturnsIQueryable()(1) 
      
      But it seems that the url should use the $filter query option instead, something like:
      http://localhost:59678/FunctionReturnsIQueryable()?$filter=Id eq 1 
      When I try to filter the query by any other entity property, not the identificator, I get the url like the last one and everything works fine.
      
      
    • @Ruslan Marchenko
      
      This is by design, when OData Client found that you are using the key property with 'eq' operator, it will translate it into a (key).But for other properties, it will translate it to $filter .
  • Expand is not working correctly
    1 Posts | Last post February 16, 2015
    • The expand is only showing the first object in the DataServiceCollection.
      For example: odata/Orders?$expand=OrderLines in a browser shows more than 1 order line.
      Also when using fiddler and the OData v4 Client Code Generator I can see that multiple order lines are being returned but once the OData v4 Client deserializes the json then it only adds the 1st item to the OrderLines property of Order.
      
  • Bug when calling IQueryable service with "KEY" that returns more than one objec
    4 Posts | Last post February 10, 2015
    • I have an IQueryable method on the OData server that when you pass it a "KEY" it will return multiple records.
      Think of it like OrderDetail service where you pass the OrderID to get all details.
      Like this.
      
      [EnableQuery()]
      public IQueryable<OrderDetail> GetOrderDetail([FromODataUri()]
      long key, ODataQueryOptions<OrderDetail> queryOptions)
          {
              var results = (from OD in db.OrderDetail where OD.OrderID == key);
              return results;
          }
      
      Now lets assume there are 2 order details that get returned.
      On the client if I use the OData client code like this:
      
          var results = (from OD in db.OrderDetail where OD.OrderID == 3 select OD).ToList();
      
      I do get 2 order details as expected BUT the second order detail is a exact copy of the first order detail.
      If I open Fiddler and look at the response I can see that there are 2 distinct order details returned but the OData client maps the first return to the second record.
      
      It gets even more interesting if you try to use the OData.Client.DataServicesCollection in that you only get 1 record back yet two are in the response.
      For example this will only return 1 record.
      
          var results = new New Microsoft.OData.Client.DataServiceCollection<OrderDetail>(from OD in db.OrderDetail where OD.OrderID == 3 select OD)
      
      
    • To provide access to a navigation property of the parent object you should declare the method in your OrdersController like this:
      [EnableQuery]
      public IQueryable<OrderDetail> GetOrderDetails([FromODataUri] int key)
      {
          return db.Orders.Where(order => order.Id == key).SelectMany(order => order.OrderDetails)
      }
      
      Hope that helps.
    • @David Totzke
      I'm sorry but that is the same thing I already have listed. 
      All you did was change the "long key" to "int key" and removed the "queryOptions".
      If you remove the queryOptions then you can add special logic like custom paging.
      The code I listed works fine when used outside of the Client Code Generator.
    • CORRECTION:  
      "If you remove the queryOptions then you can't add special logic like custom paging.
      The code I listed works fine when used outside of the Client Code Generator."
1 - 10 of 22 Items