1

OK、ASP.NET Web API に問題があります。作成方法については、このチュートリアルに従いました。目的に合わせてチュートリアルを修正しました。

ダウンロード URL のコレクションを持つパッチ クラスがあります。API はすべての情報を正常に返していますが、DownloadURL のコレクションのみが null として返されます。ただし、コードを段階的にデバッグすると、コレクションが正しく返されました。私は何を間違えましたか。エラーを見つけることができません。モデルは次のとおりです。

public class Patch
{
    [Key]
    [Required]
    [JsonProperty("PatchVersion")]
    public string PatchVersion { get; set; }

    [Required]
    [JsonProperty("Length")]
    public long Length { get; set; }

    [JsonProperty("VersionToUpdateFrom")]
    public string VersionToUpdateFrom { get; set; }

    [JsonProperty("DownloadUris")]
    public ICollection<DownloadUri> DownloadUris { get; set; }
}

public class DownloadUri
{
    [Key]
    [Required]
    [JsonProperty("AbsolutePath")]
    public string AbsolutePath { get; set; }

    [Required]
    [JsonProperty("IndirectDownload")]
    public bool IndirectDownload { get; set; }
}

これは私の DataContext クラスです:

public class PatchesContext : DbContext
{
    public PatchesContext()
        : base("name=PatchesContext")
    {
    }

    public DbSet<Patch> Patches { get; set; }

    public DbSet<DownloadUri> DownloadUris { get; set; }
}

これは ContextInitializer です

public class PatchesContextInitializer : DropCreateDatabaseIfModelChanges<PatchesContext>
{
    protected override void Seed(PatchesContext context)
    {

        var downloadUri = new List<DownloadUri>
        {
            new DownloadUri
            {
                AbsolutePath = "http://downloadUri1.test", IndirectDownload = false
            },
            new DownloadUri
            {
                AbsolutePath = "http://downloadUri2.test", IndirectDownload = false
            }
        };

        var patches = new List<Patch>
        {
            new Patch
            {
                Length = 100000, PatchVersion = "1.0.0.0", VersionToUpdateFrom = string.Empty, DownloadUris = downloadUri
            },
            new Patch
            {
                DownloadUris = null, Length = 10000, PatchVersion = "1.1.0.0", VersionToUpdateFrom = "1.0.0.0"
            }
        };
        patches.ForEach(p => context.Patches.Add(p));
        context.SaveChanges();
    }
}

そして最後に、これが私のコントローラ クラスです。Post、Put、および Delete メソッドは、まだテストしていないため省略しました (get が機能しない場合は意味がありません)。

public class AdminController : ApiController
{
    private PatchesContext db = new PatchesContext();

    // GET api/Admin
    public IEnumerable<Patch> GetPatches()
    {
        return db.Patches.AsEnumerable();
    }

    // GET api/Admin/5
    public Patch GetPatch(string version)
    {
        Patch patch = db.Patches.Find(version);
        if (patch == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }

        return patch;
    }
}

皆さんが私を助けてくれることを願っています。

/編集: ヘッダーは次のようになります。

Status Code: 200 OK
Cache-Control: no-cache
Content-Length: 291
Content-Type: application/json; charset=utf-8
Date: Fri, 25 Oct 2013 17:25:48 GMT
Expires: -1
Pragma: no-cache
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?RTpcVXNlcnNcUm9iZXJ0XERvY3VtZW50c1xWaXN1YWwgU3R1ZGlvIDIwMTJcUHJvamVjdHNcTjQ0V2Vic2l0ZVxONDRXZWJzaXRlXGFwaVxhZG 1pbg==?=

応答本文は次のようになります。

[

  {
    "$id": "1",
    "PatchVersion": "1.0.0.0",
    "Length": 100000,
    "VersionToUpdateFrom": "",
    "DownloadUris": null
  },
  {
    "$id": "2",
    "PatchVersion": "1.1.0.0",
    "Length": 10000,
    "VersionToUpdateFrom": "1.0.0.0",
    "DownloadUris": null
  }
]
4

1 に答える 1

0

Patch.DownloadUris プロパティを明示的にロードしていないか、そのプロパティが仮想ではないため、遅延ロードも行われません。

次の行で DownloadUris のインクルードを介して明示的にロードします。

Patch patch = db.Patches.Find(version);

に (未テスト)

Patch patch = db.Patches.Find(version).Include("DownloadUris");

または、そのプロパティを仮想化し、コンテキストで遅延読み込みが有効になっていることを確認します。

編集注: Seed メソッドのコード サンプルに記載されているように、Patch (1.1.0.0) ではそのプロパティを null に設定しているため、Patch (1.0.0.0) のみが DownloadUris の値を持ちます。

于 2013-10-25T18:00:12.480 に答える