Как вы переходите / настраиваете навигацию от сложного типа к типу сущности в OData в ASP.NET Ядро?

#c# #asp.net-core #odata #asp.net-core-3.1

#c# #asp.net-core #odata #asp.net-core-3.1

Вопрос:

В названии в основном говорится о моем вопросе, скажем, у меня есть такие классы

 public class ContrivedComplexClass
{
    public string stringy { get; set; }
    public ContrivedEntityClass ContrivedEntityClass { get; set; }
}

public class ContrivedEntityClass
{
    public Guid Id { get; set; }
    public int inty { get; set; }
}
  

мое действие контроллера выглядит так

 [HttpGet]
[ODataRoute("GetContrivedComplexClass()")]
public async virtual Task<ContrivedComplexClass> GetContrivedComplexClass()
{
     await Task.Delay(10);
     ContrivedComplexClass contrivedComplexClass = new ContrivedComplexClass() { stringy = "asdf", ContrivedEntityClass = new ContrivedEntityClass() { Id = Guid.NewGuid(), inty = 3 } };
     return contrivedComplexClass;
}
  

и моя модель edm настроена следующим образом

 var builder = new ODataConventionModelBuilder(serviceProvider);
builder.EntitySet<ContrivedEntityClass>("ContrivedEntityClass").EntityType.HasKey(f => f.Id);
builder.Function("GetContrivedComplexClass").Returns<ContrivedComplexClass>();
  

когда я вызываю функцию из браузера или postman или что-то еще с URL-адресом

 https://localhost:5001/odata/GetContrivedComplexClass()?Expand=ContrivedEntityClass
  

он возвращает только свойства сложного типа, такие как

 {"@odata.context":"https://localhost:5001/odata/$metadata#WebPortal.ContrivedComplexClass","stringy":"asdf"}
  

У кого-нибудь есть идеи, как я должен запрашивать или настраивать это?

Ответ №1:

Настройте свою модель EDM следующим образом:

 private static IEdmModel GetEdmModel()
{​​​​
    var builder = new ODataConventionModelBuilder();
    builder.EntitySet<ContrivedEntityClass>("ContrivedEntityClass").EntityType.HasKey(f => f.Id); ;
    var function = builder.Function("GetContrivedComplexClass");
    function.ReturnsFromEntitySet<ContrivedComplexClass>("GetContrivedComplexClass");
    return builder.GetEdmModel();
}​​​​
  

Добавьте ключ в надуманный ComplexClass:

 public class ContrivedComplexClass
{​​​​
    [Key]
    public int Id {​​​​ get; set; }​​​​
    public string stringy {​​​​ get; set; }​​​​
    public ContrivedEntityClass ContrivedEntityClass {​​​​ get; set; }​​​​
}​​​​



public class ContrivedEntityClass
{​​​​
    public Guid Id {​​​​ get; set; }​​​​
    public int inty {​​​​ get; set; }​​​​
}​​​​
  

С URL-адресом:

 https://localhost:5001/odata/GetContrivedComplexClass()?$Expand=ContrivedEntityClass
  

Контроллер:

 [HttpGet]
[ODataRoute("GetContrivedComplexClass()")]
public async virtual Task<ContrivedComplexClass> GetContrivedComplexClass()
{​​​​
    await Task.Delay(3);
    ContrivedComplexClass contrivedComplexClass = new ContrivedComplexClass
    {​​​​
        Id = 1,
        stringy = "asdf",
        ContrivedEntityClass = new ContrivedEntityClass()
        {​​​​
            Id = Guid.NewGuid(),
            inty = 3
        }​​​​
    }​​​​;
    return contrivedComplexClass;
}​​​​
  

Результат:

введите описание изображения здесь

Комментарии:

1. Спасибо! Я думал о попытке добавить идентификатор к сложному типу, но не подумал бы о возврате из части сбора.