2017-02-22 13 views
1

モデル間の関係が数多くあるASP.NET Web APIに問題があります。ここに私のモデルは、(私は簡潔にするために簡略化しました)です:多数のリレーションシップを持つASP.NET Web API

public class Model1 
{ 
    public int Model1ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Model2> Model2s{ get; set; } 

    public string Self 
    { 
     get 
     { 
      return string.Format(CultureInfo.CurrentCulture, 
       "api/model1/{0}", this.Model1ID); 
     } 
     set { } 
    } 
} 

public class Model2 
{ 
    public int Model2ID { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Model1> Model1s{ get; set; } 

    public string Self 
    { 
     get 
     { 
      return string.Format(CultureInfo.CurrentCulture, 
       "api/model2/{0}", this.Model2ID); 
     } 
     set { } 
    } 
} 

と私の関連MODEL1 APIコントローラの抜粋:

public class Model1sController : ApiController 
{ 
    private ApplicationDbContext db = new ApplicationDbContext(); 

    // GET: api/Model1s 
    public IQueryable<Model1> GetModel1s() 
    { 
     return db.Model1s; 
    } 

    ... 
} 

私は長いJSONはネストされた取得/ API/model1sに移動しますエラー、ここでは最も内側の例外メッセージです。

There is already an open DataReader associated with this Command which must be closed first. 

私が達成しようとしているのは、このような出力ですが、どのように動作させるかを理解できません。おそらくあなたが取得しているエラーを防止する方法として

[{ 
    "Model1ID": 1, 
    "Name": "Some model 2 name", 
    "Model2s": [{ 
     "Model2ID": 1, 
     "Name": "Another model 2 name" 
    }, { 
     "Model2ID": 2, 
     "Name": "Some model 2 name" 
    }] 
}, { 
    "Model1ID": 2, 
    "Name": "Another model 1 name", 
    "Model2s": [{ 
     "Model2ID": 2, 
     "Name": "Some model 2 name" 
    }] 
}] 
+0

データベースとはどのように話していますか? – BillRuhl

+0

私は確信していません。私はこのチュートリアルを使用して私のプロジェクトを開始しました。私の問題をより明確にするために、https://docs.microsoft.com/en-us/azure/app-service-web/web-sites-dotnet-rest-service -aspnet-api-sql-database –

+0

OK ...新しい質問。なぜあなたのモデルはそれのように設定されていますか?それぞれが他のもののリストを含んでいるように見えます...あなたが本当に欲しいものは何ですか?それはあなたの問題を引き起こす可能性があります。 – BillRuhl

答えて

0

必要なものと呼ばれ、連想エンティティされ、一部の開発者は、ルックアップテーブルにそれらを呼び出します。連想エンティティは、2つの他のエンティティ間の「関連付け」を保持する。あなたのケースでは、あなたが作成したクラスに基づいてデータベーステーブルを構築する足場のエンジンがあると思います。他の人が足場のエンジンがどのように機能するか話すことができます。

"TvProgramming"というクラスを作成し、Name、Id、Host_Id、Host_Name、Listの各プロパティを設定します。今度はこのセットアップで、あなたが望む数だけホストし、多くのテレビショーを開催し、独自の番組スケジュールを作成することができます。

tv showとhostオブジェクトは、自分自身に固有のプロパティしか持たないように調整します。つまり、TvShowには名前、ID、長さなどがあります。ホストは名前、ID、ネットワーク、位置情報を持っているかもしれませんが、ホストオブジェクトとテレビ番組オブジェクトは他のものを知らないことに気付きます。

apiが返すべきものは、ホストを含​​むTvProgrammingオブジェクトのセットで、ホストごとにテレビ番組のリストがあります...ここでは、私が話しているクラス構造の簡単な例を示します。あなたのニーズに合うように少し調整する必要がありますが、それを開始する必要があります。

namespace YourProjectName.Models 
{ 
    public class TvShow 
    { 
     public int id { get; set; } 
     public string name { get; set; } 
     public TimeSpan length { get; set; } 
     public string rating { } 

     public TvShow() { } 
    } 

    public class Host 
    { 
     public int id { get; set; } 
     public string name { get; set; } 
     public string network { get; set; } 
     public string city { get; set; } 
     public string state { get; set; } 
     public string zip { get; set; } 
     public string country { get; set; } 

     public Host() { } 
    } 

    public class TvProgramming 
    { 
     public int id { get; set; } 
     public string name { get; set; } 
     public int host_Id { get; set; } 
     public string host_Name { get; set; } 
     public List<TvShow> shows { get; set; } 

     public TvProgramming() 
     { 
      this.shows = new List<TvShow>(); 
     } 
    } 
} 
+0

これは非常に意味があります、ありがとう! –

0

、このようなあなたのコントローラのコードを変更してみてください。

public class Model1sController : ApiController 
{ 
    // GET: api/Model1s 
    public IQueryable<Model1> GetModel1s() 
    { 
     using (var db = new ApplicationDbContext()) 
     { 
      return db.Model1s; 
     } 
    } 
} 
+0

興味深いことに、今私は別のエラーが発生します:「DbContextが破棄されたため、操作を完了できません。 –

関連する問題