2017-02-22 45 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 { } 
    } 
} 

和我的相關型號1 API控制器摘錄:

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

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

    ... 
} 

當我瀏覽到/ API/model1s我弄了半天JSON嵌套錯誤,這裏是最內層的異常消息。

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

好的......新的問題。爲什麼你的模型是這樣設置的?它看起來每個都包含另一個列表...是你真正想要的嗎?這可能會導致你的問題。 – BillRuhl

回答

0

你需要被調用,關聯實體是什麼,一些開發者稱他們查找表。一個關聯實體將持有兩個其他實體之間的「關聯」。在你的情況下,我相信有一個腳手架引擎可以根據你創建的類爲你建立數據庫表。其他人可能會說出腳手架引擎如何工作。

我想創建一個名爲「TvProgramming」級,並給它的屬性名稱,標識,HOST_ID,HOST_NAME和列表。現在,隨着此設置,您可以擁有儘可能多的主機和儘可能多的電視節目,並且仍然創建獨特的節目安排。

調整電視節目和主機對象,使他們只能是他們自己惟一的,即一個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已被處置。」 –