多对多关系的模型绑定

本文关键字:绑定 模型 关系 | 更新日期: 2023-09-27 17:57:48

我有这样的表

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

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

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

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

多对多关系的模型绑定

Ladislav关于实体关系是正确的。如果要使其工作,则必须从关联表中删除Id字段。此外,在数据模型中,每个实体都需要有一个引用其他集合的导航属性:

public partial class Driver
{
     public int Id { get; set; }
     // other properties
     [UIHint("Licenses")]
     public virtual ICollection<License> Licenses { get; set; }
}

Driver类也是如此。然而,我认为尝试使用无线电按钮不会很好。在我正在进行的一个项目中,我们有几种这样的情况,我们使用列表框。

在您希望用户选择的集合上使用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设置为所有可能的许可证选项。在Driver编辑视图中,您只需调用:

@Html.EditorFor(m=>m.Licenses)

您在模型上设置的UIHint将找到正确的部分视图,并将显示所有许可证选项选择为当前驱动程序设置的所有选项。

我知道这个答案不能直接回答你的问题(使用单选按钮),但考虑到你的情况,这是我的建议。

正如我在评论中发布的那样,您应该会立即看到这一点。如果你不简单地停止工作,做一些学习。

这是Drivers和Licence之间的多对多,必须使用关系数据库(DriversLicence)中的连接表进行建模。概念抽象的多对多被分解为两个一对多,在Drivers和DriversLicense之间,在Licence和DriversLicence之间。

EFv4能够直接处理多对多,但在您的情况下不能,因为您的连接表不仅包含外键列(LicenseId和DriverId),还包含附加列(Id)。EF只有在将其建模为时才能隐藏连接表

DriversLicence
----------------
LicenceId
DriverId

其中这两列组成复杂的主键。如果您在表中留下Id列,您的DriversLicence将作为其他实体公开。