2015-09-21 34 views
0

我是MVC的新手,我很難弄清楚我如何在模型中擁有一個集合(枚舉)。如何正確建立MVC模型的布爾標誌列表?

我有一個模型叫API:

public class API 
{ 
    public int APIId { get; set; } 

    public int APICategoryId { get; set; } 
    public virtual APICategory APICategory { get; set; } 
    public string APIName { get; set; } 
    ... 

    public Dictionary<int, bool> SupportedPlatforms { get; set; } 
} 

正如你可以在上面看到,我希望每個API有支持的平臺,它可以是每個API不同的列表。

在控制器上,我使用Platform Ids作爲鍵和布爾值填充字典。

public ActionResult CreateAPI() 
    { 
     var model = new API(); 
     model.SupportedPlatforms = new Dictionary<int, bool>(); 
     var platformList = platforms.GetAll(); 
     foreach (Platform p in platformList) 
     { 
      if (!model.SupportedPlatforms.ContainsKey(p.PlatformId)) 
      { 
       model.SupportedPlatforms.Add(p.PlatformId, false); 
      } 
     } 
     return View(model); 
    } 

視圖只是爲每個鍵 - 值對生成一個複選框。

在調試模式下,我看到該字典已正確列舉,因此用戶如何選擇HttpPost上的複選框。 但是,這個字典不是「保存」到數據庫中,當我嘗試訪問SupportedPlatforms post方法外的其他地方時,它會爲我返回null。

當我看看服務器瀏覽器時,我甚至沒有看到API表的SupportedPlatforms列。

這是實體框架如何工作(枚舉不保存到數據庫)?

如果是這種情況,建模布爾類似的列表/地圖的最佳方法是什麼?

在此先感謝。


編輯:

我只是想更清晰一點的問題:

我將如何在上述情況下的實體模型?

在數據庫中,我應該有一個可擴展的平臺數量,平臺不應直接與API相關。

但是,任何API都可以有多個支持平臺的列表,從而創建一對多關係。

再次感謝。

+1

實體框架模型類決不能直接用作ViewModel對象。 – Dai

+1

您應該使用具有屬性'List SupportedPlatforms'的視圖模型,其中'PlatformViewModel'包含屬性'int ID'和'bool IsSelected'。你的數據庫需要一個關係表 - 包含APIId(FK到API表)和PlatformId(FK到平臺表) –

+0

@StephenMuecke你好斯蒂芬,我已經添加了一個編輯原始問題後,你指出最大一部分。 什麼是創建這種關係的最佳方式,其中一個APIId可以具有多個PlatformId? – JTY

回答

1

在這種情況下你需要注意2點。

首先,不要直接使用實體框架模型作爲ViewModels。您應該創建一個具有必要屬性的新ViewModel並在其上填充數據。

然而,這本詞典是不是「保存」到數據庫

如果您希望將數據保存到數據庫中,你必須自己做。例如:

using (var context = new MyDbContext()) 
{ 
    // Do something with your data here 

    // Call SaveChanges() to save your changes to the database. 
    context.SaveChanges(); 
} 
+0

感謝您的回答。我只是想清除HttpPost方法,我調用SaveChanges()。對不起,在原始問題上不包括郵政編碼。然而,問題依然存在,所有基本屬性(如字符串或整數)都將被保存並提交給數據庫,而不是集合。 EF不處理代碼優先收集屬性的自動綁定,我是否需要與控制器一起創建單獨的關係表來完成這項工作? 再次感謝! – JTY

+0

看來你的問題已經解決了。那很棒 :) – AnhTriet