【发布时间】:2016-09-12 14:35:17
【问题描述】:
我在 MVC 项目中使用实体框架 6.1 和代码优先方法。
public class PackageDaySchedule
{
public int Id {get;set;}
public DateTime Time {get;set;}
Public int PackageId {get;set;}
Public int? PackageCity{get;set;}
public int? PackageHotelId {get;set;}
Public int? PackagePlaceToVisitId {get;set;}
//navigation property
public virtual Package {get;set;}
public virtual PackageCity Package City {get;st;}
public virtual PackageHotel PackageHotel {get;st;}
public virtual PackagePlaceToVisit PackagePlaceToVisit{get;set;}
}
Public class Package {
Public int PackageId {get;set;}
Public List<PackageCity> PackageCities {get;set;}
}
Public class PackageCity{
[Key, Column(Order = 0)]
Public int PackageId {get;set;}
[Key, Column(Order = 1)]
public int CityId {get;set;}
public List<PackageHotel> PackageHotels {get;set;}
//virtual properties - Package and City
}
Public class PackageHotel{
[Key, Column(Order = 0)]
Public int PackageId {get;set;}
[Key, Column(Order = 1)]
public int CityId {get;set;}
[Key, Column(Order = 2)]
Public int HotelId {get;set;}
//virtual properties - Package,City, Hotel
}
对于一个 PackageDaySchedule,应该有一个 packageCity 或 packagehotel 或 PackagePlaceToVist。我的问题是如何使用数据注释为 PackageDayShedule 表指定外键。 PackageId 常见于 PackageCity、PackageHotel 和 PackagePlaceToVist 导航属性。
【问题讨论】:
-
首先,使用复合键几乎总是一个坏主意。其次,使用由外键组成的复合键总是是个坏主意。第三,使用由 nullable 外键组成的复合键是一个简单的灾难性想法。只需使用常规的
identity或uniqueidentifier列作为主键,就可以了。 -
你为什么把它放在 MVC 中?
-
@ChrisPratt 非常感谢您的提示。我会根据你的建议改变设计。
-
@ChrisPratt 如果你不介意,你能解释一下为什么我不应该对 PackageCIty 表使用复合键。 PackageCity 是 Package 和 City 实体之间的多对多关联(中间)表。 (PackageHotel 是 City & Hotel 实体的多对多中间表)
-
连接表上的复合键通常是可以的。因此,我为此说“几乎总是一个坏主意”。但是,在您计划直接查询的表上使用复合键,尤其是如果您要与这些表建立进一步的关系时,这种情况开始迅速失控。
标签: c# data-annotations code-first