Я настроил службу WebAPI ODATA (используя 5.0.0-rc1 для $ expand и $ select поддержки), и все, кажется, работает отлично, но свойства навигации.breezejs: свойство навигации не добавлено к объекту
Метаданные действительно содержит мое свойство навигации (OpenPositions по мандату):
Тогда мой ветер запрос следующим образом:
function search() {
var query = breeze.EntityQuery.from("Mandates").expand("OpenPositions").inlineCount();
return manager.executeQuery(query.using(service)).then(function (result) {
logger.info(result);
}).fail(function (error) {
logger.error(error);
});
}
Контроллер WebAPI:
[Queryable(AllowedQueryOptions= AllowedQueryOptions.All)]
public override IQueryable<Mandate> Get()
{
return new List<Mandate>() { new Mandate() {
Id = 1,
PolicyNumber = "350000000",
OpenPositions = new List<OpenPosition>(){
new OpenPosition(){ Id = 1, Amount = 2300, Mandate_Id = 1 },
new OpenPosition(){ Id = 2, Amount = 2100, Mandate_Id = 1 }
}},
new Mandate() {
Id = 2,
PolicyNumber = "240000000" ,
OpenPositions = new List<OpenPosition>(){
new OpenPosition(){ Id = 3, Amount = 2500, Mandate_Id = 2 },
new OpenPosition(){ Id = 2, Amount = 2100, Mandate_Id = 2}
}
} }.AsQueryable<Mandate>();
}
Ничего впечатляющего. Но хотя мои объекты Mandate возвращаются в набор результатов, у них нет своей коллекции OpenPositions.
В качестве теста, если добавить .select("OpenPositions")
на мой ветер запрос, то я получаю сообщение об ошибке:
unable to locate property: OpenPositions on entityType: Mandate:#WebAPINoBreeze.Models
Почему это может быть?
[EDIT] query.entityType.NavigationProperties является пустым массивом, так что, вероятно, ключ ... Кажется, ветер не мог построить navigationproperties из метаданных. добавлено
[EDIT]
внешнего ключа. проблема все еще существует:
public class Mandate
{
public int Id { get; set; }
public string PolicyNumber { get; set; }
public EStatus Status { get; set; }
public virtual List<OpenPosition> OpenPositions { get; set; }
}
public class OpenPosition
{
public int Id { get; set; }
public decimal Amount { get; set; }
[ForeignKey("Mandate")]
public int Mandate_Id { get; set; }
}
** [EDIT] **
По ряду причин [ForeignKey («Мандат»)] атрибут был удален во время компиляции (я думаю, это потому, что генерируется класс модели . Я нашел обходной путь и метаданные теперь содержит внешний ключ MandateId к мандату в OpenPositions:.
Спасибо. Я добавил внешний ключ (см. Обновление к моему сообщению), но проблема остается. Я здесь что-то не так? – Sam
Похоже, вы имеете однонаправленное отношение. Вы использовали Fluent API для правильной настройки? – sbelini
Я полностью восстановил свою модель, используя генератор кода OpenAccess DataBase First. У меня есть двунаправленное отношение (Mandate -> OpenPositions и OpenPositions -> Mandate). И теперь вместо того, чтобы возвращать результаты из IList, как выше, я просто возвращаю контекст OpenAccess. Тем не менее, breezejs все еще не знают о моих навигационных свойствах. Похож на меня. Я получил его, чтобы работать, когда я использовал контроллер ветерок WebApi. Проблема возникла, когда я прекратил использовать контроллер. – Sam