2013-08-29 3 views
1

Я настроил службу WebAPI ODATA (используя 5.0.0-rc1 для $ expand и $ select поддержки), и все, кажется, работает отлично, но свойства навигации.breezejs: свойство навигации не добавлено к объекту

Метаданные действительно содержит мое свойство навигации (OpenPositions по мандату):

enter image description here

Тогда мой ветер запрос следующим образом:

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:.

enter image description here

ответ

2

Вы должны определить внешний ключ, как Breeze ассоциация требует FKs http://www.breezejs.com/documentation/navigation-properties

[EDIT]

Ваш двунаправленная ассоциация должна выглядеть следующим образом:

public class Mandate 
{ 
    public int Id { get; set; } 
    public string PolicyNumber { get; set; } 

    public virtual ICollection<OpenPosition> OpenPositions { get; set; } 
} 

public class OpenPosition { 
    public int Id { get; set; } 
    public decimal Amount { get; set; } 

    public int MandateId { get; set; } 
    public Mandate Mandate {get; set; } 
} 
+0

Спасибо. Я добавил внешний ключ (см. Обновление к моему сообщению), но проблема остается. Я здесь что-то не так? – Sam

+0

Похоже, вы имеете однонаправленное отношение. Вы использовали Fluent API для правильной настройки? – sbelini

+0

Я полностью восстановил свою модель, используя генератор кода OpenAccess DataBase First. У меня есть двунаправленное отношение (Mandate -> OpenPositions и OpenPositions -> Mandate). И теперь вместо того, чтобы возвращать результаты из IList, как выше, я просто возвращаю контекст OpenAccess. Тем не менее, breezejs все еще не знают о моих навигационных свойствах. Похож на меня. Я получил его, чтобы работать, когда я использовал контроллер ветерок WebApi. Проблема возникла, когда я прекратил использовать контроллер. – Sam

Смежные вопросы