2011-05-28 102 views
0

结合我有这样模型多对多的关系

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


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


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

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

+1

如果您对关系数据库有任何最少的理解,您应该知道这些表之间应该是什么关系。如果您没有这么简单的理解,请停止当前的任务,然后阅读关系数据库的一些启动任务,否则您将无法完成项目。 – 2011-05-28 10:06:18

+0

是的,我有这种理解。但不知道如何在特定用户的单选按钮中显示 – coure2011 2011-05-28 10:14:03

+0

您必须加载来自许可证的所有记录 - 定义您的单选按钮。然后,您必须使用其DriverLicences/Licenses加载用户并设置单选按钮以更正值。 – 2011-05-28 10:16:13

回答

0

正如我在评论中发布的,你应该立即看到这一点。如果你不仅仅停止你的工作并做一些学习。

这是驱动程序和许可证之间的多对多关系,必须使用关系数据库(DriversLicence)中的关联表建模。概念抽象中的多对多在驱动程序和驱动程序许可证之间以及许可证和驱动程序许可证之间分为两个一对多。

EFv4能够直接使用多对多而不是您的情况,因为您的联结表不仅包含外键列(LicenceId和DriverId),而且还包含附加列(Id)。 EF只能在您将模型设置为

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

这两个列组成复杂主键时才可以隐藏结点表。如果您离开表中的Id列,则您的DriversLicence将作为其他实体公开。

+0

仍然没有得到如何显示驱动程序的单选按钮值? – coure2011 2011-05-28 11:28:47

+0

如何从许可证表中显示单选按钮? @ Html.RadioButton(这里有什么)? – coure2011 2011-05-28 11:36:36

2

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 - 必须〜/查看/共享/ 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你的模型设定会找到正确的局部视图,并显示所有许可选项选择所有的当前驾驶员设定的。

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