簡體   English   中英

多對多和一對多(EF)-代碼優先

[英]Many-to-Many & One-to-Many (EF) - Code First

為學校類型的系統創建代碼優先數據庫。

我苦苦掙扎的是課程和用戶部分。

用戶

  • 可以參加很多課程
  • 可以教多門課程

課程

  • 可以有很多用戶
  • 只能有一位老師

以下是我的課程和用戶的2種模型

public class User
{
  public virtual ICollection<Course> CoursesRunning { get; set; }

  public virtual ICollection<Course> CoursesTaking { get; set; }

  [DataType(DataType.Date)]
  [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
  [Required]
  public DateTime DoB { get; set; }

  [Required]
  public string EmailAddress { get; set; }

  [Required]
  public string FirstName { get; set; }

  [Required]
  public string LastName { get; set; }

  [Required]
  public string Password { get; set; }

  [Key]
  public int UserId { get; set; }

  public User()
  {
    CoursesRunning = new HashSet<Course>();
    CoursesTaking = new HashSet<Course>();
  }
}

public class Course
{
  [Key]
  public int CourseId { get; set; }

  /// <summary>
  /// The name of the course
  /// </summary>
  public string Name { get; set; }

  /// <summary>
  /// The owner of the course
  /// </summary>
  public virtual User User { get; set; }

  /// <summary>
  /// The users on the course
  /// </summary>
  public virtual ICollection<User> Users { get; set; }

  public Course()
  {
    Users = new HashSet<User>();
  }
}

如您所見,我的User類中有2個收藏集,然后Course課程中有2個收藏集。

我必須在虛擬屬性上設置外鍵屬性,但是我不確定。

嘗試搜索了最近幾個小時,但找不到符合此需求的任何內容。

謝謝

您所需要做的就是映射定義每個關系的相應導航屬性。

如果您更喜歡數據注釋,可以使用InverseProperty屬性,例如

public class User
{
    [InverseProperty(nameof(Course.User))]
    public virtual ICollection<Course> CoursesRunning { get; set; }

    [InverseProperty(nameof(Course.Users))]
    public virtual ICollection<Course> CoursesTaking { get; set; }
}

要么

public class Course
{
    [InverseProperty(nameof(User.CoursesRunning))]
    public virtual User User { get; set; }

    [InverseProperty(nameof(User.CoursesTaking))]
    public virtual ICollection<User> Users { get; set; }
}

等等

或者,您也可以使用流暢的配置(我的首選):

modelBuilder.Entity<User>()
    .HasMany(e => e.CoursesRunning)
    .WithRequired(e => e.User)
    .WillCascadeOnDelete(false);

modelBuilder.Entity<User>()
    .HasMany(e => e.CoursesTaking)
    .WithMany(e => e.Users);

注意:在上述示例中,如果我不是您想要的意思,則可能需要交換“ Running和“ Taking映射。

更新:我幾乎總是忘記兩個實體之間存在多個關系會導致著名的多個級聯路徑錯誤。 因此,您需要關閉級聯刪除,並且只能使用流利的API來完成,因此不能使用數據注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM