C# 多个可为空的复合外键

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

我在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
{
公共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;}
    
    }

  • 公共虚拟注册是一个导航属性,它持有与该实体相关的其他实体,例如,在我们的案例中,学生实体将持有与他相关的所有注册实体的数据

    提示:具有1:M关系的表&它位于1侧,它的模型表示应该包括M表的导航属性,并且它应该是一个集合

  • 课程表 和那个学生一样

    3。注册人数表

    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;}
    
    }

  • SudentID属性是外键,相应的导航属性是Student。一个注册实体与一个学生实体相关联,因此该属性只能保存一个学生实体,这就是为什么我们没有使用IEnumerable。 courseID属性也是如此


    提示:M端的表应该包括外键和相应的导航属性,但不包括集合。

    首先,使用复合键几乎总是一个坏主意。其次,使用由外键组成的复合键总是一个坏主意。第三,使用由可为空的外键组成的复合键简直是一个灾难性的想法。只需使用常规的
    identity
    uniqueidentifier
    列作为主键,并将其命名为day。为什么要将其放在MVC中?@ChrisPratt非常感谢您提供的提示。我将根据您的建议更改设计。@ChrisPratt如果您不介意,请您解释一下为什么我不应该对PackageCIty表使用复合键。PackageCity是包和城市实体之间的多对多关联(中间)表。(PackageHotel是城市和酒店实体的多对多中间表)连接表上的复合键通常可以。因此,我说“几乎总是一个坏主意”。然而,在您计划直接查询的表上使用组合键,特别是如果您要创建与这些表的进一步关系,那么组合键很快就会失控。非常感谢!