1

WebAPI ODATA サービス ($expand および $select サポートに 5.0.0-rc1 を使用) を構成しましたが、ナビゲーション プロパティ以外はすべて正常に動作しているようです。

メタデータには、私のナビゲーション プロパティ (Mandate の 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

なぜそれができますか?

[編集] query.entityType.NavigationProperties は空の配列なので、おそらく手がかりです...そよ風がメタデータからナビゲーションプロパティを構築できなかったようです。

[編集]

外部キーが追加されました。問題はまだあります:

 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; }
}

**[編集] **

何らかの理由で [ForeignKey("Mandate")] 属性がコンパイル時に削除されました (モデル クラスが生成されたためだと思います。回避策が見つかり、メタデータには OpenPositions で Mandate する外部キー MandateId が含まれるようになりました。

ここに画像の説明を入力

4

1 に答える 1

2

Breeze アソシエーションには FK が必要なため、外部キーを定義する必要があります。http://www.breezejs.com/documentation/navigation-properties

[編集]

双方向の関連付けは次のようになります。

 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; }
}
于 2013-08-29T14:56:10.817 に答える