我有这样的表
License
------------
Id
LicenseName
DriversLicense
-------------
Id
LicenseId
DriverId
Drivers
-----------
Id
FirstName
LastName
许可证表中有6个输入,现在我想为特定驱动程序的所有许可选项创建带有是/否的单选按钮。什么是桌子之间最好的关系? (一对一,多对,多对)以及如何使用模型绑定显示单选按钮。
答案 0 :(得分:2)
Ladislav对实体关系是正确的。如果要使用此功能,则必须从关联表中删除Id字段。此外,在您的数据模型中,每个实体都需要具有引用其他集合的导航属性:
public partial class Driver
{
public int Id { get; set; }
// other properties
[UIHint("Licenses")]
public virtual ICollection<License> Licenses { get; set; }
}
对于Driver类也一样。但是,我认为尝试使用radion按钮不会很好。在我正在开发的项目中,我们有几种类型的情况,我们使用列表框。
在您希望用户选择的集合上使用UIHint,并创建一个部分视图来保存该类型集合的列表框。所以在Licenses.cshtml
- 必须在〜/ Views / Shared / EditorTemplates /中创建 - 你会有这样的东西:
@inherits System.Web.Mvc.WebViewPage<IList<License>>
@Html.ListBoxFor(x => x,
new MultiSelectList((List<License>)ViewBag.LicenseAll,
"Id",
"LicenseName",
Model))
在您的控制器中,将ViewBag.LicenseAll
设置为所有可能的许可证选项。在您的驱动程序编辑视图中,您只需致电:
@Html.EditorFor(m=>m.Licenses)
您在模型上设置的UIHint将找到正确的局部视图,并将显示所有许可证选项和选择为当前驱动程序设置的所有许可证。
我知道这个答案没有直接回答你的问题(使用单选按钮),但考虑到你的情况,这就是我的建议。
答案 1 :(得分:0)
正如我在评论中发布的那样,你应该立即看到这一点。如果你不是简单地停止工作并做一些学习。
这是驱动程序和许可证之间的多对多关系,必须使用关系数据库(DriversLicence)中的联结表建模。概念抽象中的多对多在Drivers和DriversLicence之间以及License和DriversLicence之间被分解为两个一对多。
EFv4能够直接使用多对多但不适用于您的情况,因为您的联结表不仅包含外键列(LicenceId和DriverId),还包含其他列(Id)。只有在使用
进行建模时,EF才能隐藏连接表DriversLicence
----------------
LicenceId
DriverId
这两列构成复杂的主键。如果您在表格中留下Id列,您的DriversLicence将作为其他实体公开。