Как объединить 2 объекта в конструкторе моделей Odata
В настоящее время я использую OData V4 и хочу присоединиться к двум таблицам Account и Product:
Таблицы следующие: Account: Id, Name, Address, ColorCode,
Продукт: Id, AccountId
AccountId в таблице Product - это внешний ключ, сопоставленный с полем Id в таблице Account.
У меня в строителе есть:
var ProductType= builder.EntityType<Product>();
Когда я создаю сущность Product, я хочу получить значения "ColorCode" от сущности Account.
Как я могу установить эти отношения в конструкторе моделей?
Я хотел бы, чтобы класс продукта выглядел так:
public class Product
{
public string Id { get; set; }
public string AccountId { get; set; }
public string ColorCode { get; set; }
}
1 ответ
OData позволяет вам определять отношения между сущностями. Кажется, что вы используете Web API 2.2 для OData V4, чтобы написать свой сервис. В этом случае вы можете построить отношения между Продуктами и Аккаунтами следующим образом:
Во-первых, в определении ваших классов POCO для Продуктов вам необходимо добавить свойство навигации для его учетных записей:
public class Product{
public int Id {get;set;}
public string AccountId {get;set;}
public Account Account {get;set;} // define "Account" as a navigation property of Product
public class Account{
public int Id {get;set;}
public string Name {get;set;}
public Address Address {get;set;} // Address may be a complex type
public int ColorCode {get;set;}
}
Затем в классе, который наследуется от DbContext
Добавьте информацию об обеих сущностях в:
public virtual DbSet<Product> Products { get; set; }
public virtual DbSet<Account> Accounts { get; set; }
Наконец, в WebApiConfig.cs вы определяете модель, используя ODataConventionModelBuilder
в соответствии с вашими потребностями. Построитель моделей автоматически распознает связь из классов POCO и сгенерирует модель для вас.
После того, как служба построена, на стороне клиента клиент отправляет такой запрос для получения Продукта и ColorCode своей Учетной записи:
GET http://host/service/Products?$expand=Account($select=ColorCode)
Пример можно посмотреть здесь: http://services.odata.org/v4/(S(xrtmlkz1igiqidututicmb2t))/TripPinServiceRW/People? $ Expand=Trips($select=TripId)