2

I have created an OData v4 Client with the OData Client Generator. This generated partial classes. I would like to extend this generated classes with IDataErrorInfo.

namespace Client.Model {
    public partial class City : IDataErrorInfo
    {
        public String this[String columnName]
        {
            return "";
        }

        public String Error { get { return ""; } }
    }
}

When i like to create a new City and send it to the server

ODataContainer container = new ODataContainer(new Uri("http://localhost:45666/odata"));
container.AddToCities(city);

I get an error

An exception of type 'Microsoft.OData.Client.DataServiceRequestException' occurred in Microsoft.OData.Client.dll.

The request is invalid. The property "Error" does not exist in Server.Model.City.

The WebApi configuration:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
            );

        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<City>("Cities");
        builder.EntitySet<Country>("Countries");

        config.MapODataServiceRoute(
            routeName: "ODataRoute",
            routePrefix: "odata",
            model: builder.GetEdmModel());
    }
}

Is there a possibilty to prevent the Error property being included in the request?

4

3 回答 3

0

我的建议是:

  1. 在同一命名空间中创建部分类“City”(使用生成类的相同命名空间City)并实现 IdataErrorInfo。
  2. Error在服务器模型中添加属性。public string Error {get; set;}

  3. 如果您使用的是 EF 代码优先方法,请在模型构建器中排除错误属性,以防止在数据库中创建“错误”列。modelBuilder.Entity<YourModelClass>().Ignore(x =>x.Error);

由于客户端代码生成器在生成的代码中生成该属性,因此无需在客户端代码的“City”类中实现错误属性Error

我有同样的问题,我以这种方式解决了它。

于 2015-11-20T05:19:59.217 回答
0

使用 OData 客户端生成的模型是部分类。当您实现时,IDataErrorInfo它会要求您实现Error服务器端当然不存在的属性。因为您在实体上进行了操作,City这会序列化 City 对象,如果有 Error 属性,它也会被序列化。

一个解决方案可能是避免这种情况并将客户端模型与 UI 分开。你可以试试这个:

namespace Client.Model {
    public partial class City
    {
        public String this[String columnName]
        {
            return "";
        }
    }
}

使用继承来创建与 UI 相关的模型类,与生成的模型类分开:

namespace UI.Model {
    public class City : Client.Model.City, IDataErrorInfo
    {
        public String Error { get { return ""; } }
    }
}

确保您在 UI 上使用 UI.Model.City,并且当您调用 OData 服务进行添加操作时,对 UI.Model.City 类对象执行显式转换以转换为 Client.Model.City,并且 Error 属性将消失:

ODataContainer container = new ODataContainer(new Uri("http://localhost:45666/odata"));
container.AddToCities((Client.Model.City)city);

注意:这种方法有其自身的缺点,因为它可能会导致您在不同的命名空间下拥有相同的类名,因此在使用相同的类名时通常必须使用完整的命名空间路径。您可以在 UI 模型上使用带有类名的不同前缀/后缀来避免它。例如CityViewModel

于 2015-07-17T20:40:01.953 回答
0

也许 OData Client Hook 可以满足您的要求。请参阅相关问题( 处理 oData 客户端上的动态属性

于 2015-07-20T08:14:33.590 回答