如何正确建模MVC模型的布尔标志列表?

时间:2015-09-21 03:52:39

标签: c# asp.net-mvc asp.net-mvc-5 enumeration

我是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上的复选框。 但是,这个字典没有“保存”到数据库,当我尝试在post方法之外的其他地方访问SupportedPlatforms时,它为我返回null。

当我查看Server Explorer时,我甚至看不到API表的SupportedPlatforms列。

这就是实体框架的工作原理(枚举未保存到数据库中)?

如果是这种情况,那么建立类似的布尔列表/地图的最佳方法是什么?

提前致谢。

编辑:

我只是想对这个问题更清楚一点:

如何在上述情况下对实体进行建模?

在数据库中,我应该拥有可扩展数量的平台,并且这些平台不应与API直接相关。

但是,任何API都可以包含多个受支持平台的列表,从而创建一对多关系。

再次感谢。

1 个答案:

答案 0 :(得分:1)

在这种情况下,您需要注意2点。

首先,不要直接使用Entity Framework Models作为ViewModels。您应该创建一个具有必要属性的新ViewModel并在其上填充数据。

  

但是,这个词典并没有“保存”到数据库

如果要将数据保存到数据库,则必须自己完成。例如:

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

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