我是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都可以包含多个受支持平台的列表,从而创建一对多关系。
再次感谢。
答案 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();
}