模型绑定多对多关系

时间:2011-05-28 09:26:38

标签: c# asp.net-mvc-3 entity-framework-4

我有这样的表

License
------------
Id
LicenseName


DriversLicense
-------------
Id
LicenseId
DriverId


Drivers
-----------
Id
FirstName
LastName

许可证表中有6个输入,现在我想为特定驱动程序的所有许可选项创建带有是/否的单选按钮。什么是桌子之间最好的关系? (一对一,多对,多对)以及如何使用模型绑定显示单选按钮。

2 个答案:

答案 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将作为其他实体公开。