Учет сложных типов и свойств в Microsoft.AspNet.OData - PullRequest
0 голосов
/ 07 мая 2019

У меня проблемы с получением сериализованного сложного объекта.Я нашел несколько примеров по этому вопросу, и мне нужна помощь.У меня есть класс POCO, который реализует интерфейс для свойства класса, как показано ниже ...

  • Проблема заключается в ... OData не может сериализовать IObjectState Свойство

КАК СДЕЛАТЬ ODATA AWARE СЛОЖНЫХ ТИПОВ В СВОЙСТВАХ?

  • Пожалуйста, имейте в виду, что IObjectState является классом не-сущности и не имеет ключа

POCO CLASS:

public class ShakeoutDocument : Document, IDocument, IStateful
{
    public IObjectState ObjectState { get; set; } //<-- This property contains the instance (below)

    public int ShakeoutId { get; set; }

    public string SchedulingBatch { get; set; }

    [...] //<-- Other properties are omitted for brevity
}

Свойство IObjectState CLASS: Вот пример конкретного класса IObjectState ...

// Example of an IObjectState Instance
public class New : IObjectState
{
    public List<IObjectStateEvent> Events { get; set; }

    public string Name { get; set; }
}

КОНФИГУРАЦИЯ EDM: Как ОБЪЕДИНЕННАЯ Функция: Использование этой конфигурации модели EDM & Api ...

modelBuilder.EntitySet<ShakeoutDocument>("ShakeoutDocument");

[HttpGet]
public ShakeoutDocument Get([FromODataUri] int id)
{
    var provider = Application.ShakeoutDocumentProvider as ShakeoutDocumentProvider;
    var entity = provider.Get(id);

    return entity;
}

Генерирует следующее исключение ...

"Данная модель не содержит тип" New "."

КОНФИГУРАЦИЯ EDM: В качестве РАЗБЛОКИРОВАННОЙ Функции: Использование этой конфигурации модели EDM & Api ...

var getShakeoutDocument = modelBuilder.Function("GetShakeoutDocument").ReturnsFromEntitySet<ShakeoutDocument>("ShakeoutDocument");
getShakeoutDocument.Parameter<int>("id");

[ODataRoute("GetShakeoutDocument(id={id})")]
public IHttpActionResult GetShakeoutDocument([FromODataUri] int id)
{
    var provider = Application.ShakeoutDocumentProvider as ShakeoutDocumentProvider;
    var entity = provider.Get(id);

    return Ok(entity);
}

Создает следующее исключение ...

"Данная модель не содержит тип" New "."

ОБНОВЛЕНИЕ КОНФИГУРАЦИИ EDM: с бетоном Новое: Обновление конфигурации модели EDM с помощью ...

modelBuilder.AddComplexType(typeof(New));

Создает следующее исключение ...

"Обнаружено значение, имя которого несовместимо с метаданными. Значение указывает его тип как «Новый», но в метаданных указан тип «IObjectState». "

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 07 мая 2019

Хорошо, после долгих поисков я нашел ответ здесь . По сути, вы должны описать OData все возможные реализации любого данного Комплексного свойства ... даже для НЕОБЪЕКТИВНЫХ ФУНКЦИЙ.

Действительно несвязанные СЛЕДУЕТ подразумевать, что используется стандартный WebApi ... но это, очевидно, не так ... так как этот объект сериализует FINE с использованием стандартного WebApi, но завершается с ошибкой с использованием OData.

private static  IEdmModel GetEdmModel()
{
    var modelBuilder = new ODataConventionModelBuilder();

    // ENTITY SETS: Normal
    modelBuilder.EntitySet<tblDbcCommunications>("Communication");
    modelBuilder.EntitySet<tblDbcItems>("Item");
    modelBuilder.EntitySet<Meter>("Meter");
    modelBuilder.EntitySet<Product>("Product");
    modelBuilder.EntitySet<WarehouseMeter>("WarehouseMeter");
    modelBuilder.EntitySet<Shakeout>("Shakeout");
    modelBuilder.EntitySet<tblDbcCircuitOwner>("tblDbcCircuitOwner");

    // ENTITY SETS: Complex
    ConfigureComplexEntitySet(modelBuilder, modelBuilder.EntitySet<ShakeoutDocument>("ShakeoutDocument"));

    // KEY BINDINGS
    modelBuilder.EntityType<WarehouseMeter>().HasKey(x => x.METER_ID);

    // UNBOUND FUNCTIONS
    //  - Action    = Post
    //  - Function  = Get

    // WarehouseMeter
    var findPulseMeter = modelBuilder.Function("FindWarehouseMeter").ReturnsCollectionFromEntitySet<WarehouseMeter>("WarehouseMeter");
    findPulseMeter.Parameter<string>("search");

    // ShakeoutDocument
    var getShakeoutDocument = modelBuilder.Function("GetShakeoutDocument").ReturnsFromEntitySet<ShakeoutDocument>("ShakeoutDocument");
    getShakeoutDocument.Parameter<int>("id");

    // Product
    var listProduct = modelBuilder.Function("ListProducts").ReturnsCollectionFromEntitySet<Product>("Product");

    return modelBuilder.GetEdmModel();
}

private static EntitySetConfiguration<ShakeoutDocument> ConfigureComplexEntitySet(ODataConventionModelBuilder modelBuilder, EntitySetConfiguration<ShakeoutDocument> configuration)
{

    // Collection Properties
    configuration.EntityType.CollectionProperty(x => x.Seals);
    configuration.EntityType.CollectionProperty(x => x.Details);

    // Complex Properties
    configuration.EntityType.ComplexProperty(x => x.ObjectState);

    // Object State
    var newObjectState = modelBuilder.ComplexType<New>();
    newObjectState.DerivesFrom<IObjectState>();

    var submittedObjectState = modelBuilder.ComplexType<Submitted>();
    submittedObjectState.DerivesFrom<IObjectState>();

    // Object State Event
    var isNewObjectStateEvent = modelBuilder.ComplexType<IsNew>();
    isNewObjectStateEvent.DerivesFrom<IObjectStateEvent>();

    var isSubmittedObjectStateEvent = modelBuilder.ComplexType<IsSubmitted>();
    isSubmittedObjectStateEvent.DerivesFrom<IObjectStateEvent>();

    return configuration;
}
...