C# 多个可为空的复合外键
我在MVC项目中使用实体框架6.1&代码优先的方法C# 多个可为空的复合外键,c#,data-annotations,code-first,C#,Data Annotations,Code First,我在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? PackagePlaceT
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
{
公共int Id{get;set;}
公共日期时间{get;set;}
公共int-PackageId{get;set;}
Public int?PackageCity{get;set;}
public int?PackageHotelId{get;set;}
Public int?PackagePlaceToVisitId{get;set;}
//导航属性
公共虚拟包{get;set;}
公共虚拟包城市包城市{get;st;}
公共虚拟套餐酒店套餐酒店{get;st;}
公共虚拟包placetovisit包placetovisit{get;set;}
}
公共类包{
公共int-PackageId{get;set;}
公共列表包城市{get;set;}
}
公共类包装城市{
[键,列(顺序=0)]
公共int-PackageId{get;set;}
[键,列(顺序=1)]
public int CityId{get;set;}
公共列表包hotels{get;set;}
//虚拟财产-包装和城市
}
公共级包装酒店{
[键,列(顺序=0)]
公共int-PackageId{get;set;}
[键,列(顺序=1)]
public int CityId{get;set;}
[键,列(顺序=2)]
公共int HotelId{get;set;}
//虚拟财产-套餐、城市、酒店
}
对于一个PackageDaySchedule,应该有packageCity或packagehotel或PackagePlaceToVist。我的问题是如何使用数据注释为PackageDaySchedule表指定外键。
PackageId对于PackageCity、PackageHotel和PackagePlaceToVist导航属性很常见。关于asp mvc模型中如何表示数据库表的摘要 模型如何表示数据库表 在下一节中,我将解释如何从code first应用程序为数据库创建数据模型,并介绍如何在ASP MVC中表示关系 在本例中,我们有三个具有以下模式的表: 学生表
public partial class Student
{
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public Nullable<System.DateTime> EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
public partial class Enrollment
{
public int EnrollmentID { get; set; }
public Nullable<decimal> Grade { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
StudentID、姓、名、注册日期
课程表
public partial class Student
{
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public Nullable<System.DateTime> EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
public partial class Enrollment
{
public int EnrollmentID { get; set; }
public Nullable<decimal> Grade { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
课程名称、头衔、学分
报名表
public partial class Student
{
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public Nullable<System.DateTime> EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
public partial class Enrollment
{
public int EnrollmentID { get; set; }
public Nullable<decimal> Grade { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
注册ID、课程ID、学生ID、年级
这些表中的每一个都必须用单独的模型表示
public partial class Student
{
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public Nullable<System.DateTime> EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
public partial class Enrollment
{
public int EnrollmentID { get; set; }
public Nullable<decimal> Grade { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
公立部分班学生
{
公共int StudentID{get;set;}
公共字符串LastName{get;set;}
公共字符串名{get;set;}
公共可为空的EnrollmentDate{get;set;}
公共虚拟ICollection注册{get;set;}
}public partial class Student
{
public int StudentID { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public Nullable<System.DateTime> EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
public partial class Enrollment
{
public int EnrollmentID { get; set; }
public Nullable<decimal> Grade { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
公共部分课程注册
{
公共整数注册ID{get;set;}
公共可空等级{get;set;}
public int CourseID{get;set;}
公共int StudentID{get;set;}
公共虚拟课程{get;set;}
公共虚拟学生学生{get;set;}
}提示:M端的表应该包括外键和相应的导航属性,但不包括集合。首先,使用复合键几乎总是一个坏主意。其次,使用由外键组成的复合键总是一个坏主意。第三,使用由可为空的外键组成的复合键简直是一个灾难性的想法。只需使用常规的
identity
或uniqueidentifier
列作为主键,并将其命名为day。为什么要将其放在MVC中?@ChrisPratt非常感谢您提供的提示。我将根据您的建议更改设计。@ChrisPratt如果您不介意,请您解释一下为什么我不应该对PackageCIty表使用复合键。PackageCity是包和城市实体之间的多对多关联(中间)表。(PackageHotel是城市和酒店实体的多对多中间表)连接表上的复合键通常可以。因此,我说“几乎总是一个坏主意”。然而,在您计划直接查询的表上使用组合键,特别是如果您要创建与这些表的进一步关系,那么组合键很快就会失控。非常感谢!