簡體   English   中英

如何與實體框架建立一對多關系?

[英]How do I represent a one to many relationship with the Entity Framework?

如何用實體框架表示ASP.NET MVC中的一對多關系?

我的項目是電話會議項目。 我有一個Conferences數據庫。 每個虛擬Conference室都有一個Title ,一個OwnerName和一個不同的DialInNumbers列表。 我知道,為了使一個Conference與許多DialInNumbers這種關系,我至少需要兩個表:一個用於Conferences ,一個至少用於DialInNumbers 我在創建,修改和訪問DialInNumbers遇到問題。 我的代碼肯定缺少某些內容。 讓我們來看看:

這是Conference的模型:

public class Conference
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string OwnerName { get; set; }
    public List<string> DialInNumbers { get; set; }
}

該模型需要一個DbContext (不確定原因)。

public class ConferenceDbContext : DbContext
{
    public DbSet<Conference> Conferences { get; set; }
}

然后,在ControllerConferenceController )中,我們可以CreateEdit Conference 例如:

public ActionResult Create(Conference conference)
{
    if (ModelState.IsValid)
    {
        conference.DialInNumbers = ThreeRandomlyGeneratedPhoneNumbers(); 

        db.Conferences.Add(conference);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(conference);
}

保存數據庫更改時,我僅獲得一張Conferences表。 如何獲得多個表,以及如何在實體框架中將它們鏈接在一起?

謝謝。

您無法在實體和字符串之間定義1:N關系。 在EF中,只能在兩個實體之間建立關系,因此DialInNumber應該由一個實體表示。

public class DialInNumber {
   public int ID { get; set; }
   public string Number { get; set; }
   public virtual Conference Conference { get; set;}
}

並且Conference類應該引用這些實體的集合,而不是字符串的集合。

public class Conference {
    public string Title { get; set; }
    public string OwnerName { get; set; }
    public virtual ICollection<DialInNumber> DialInNumbers { get; set; }    
}

和記:為了使延遲加載工作中, DialInNumbers屬性應該是虛擬的

public class Conference
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string OwnerName { get; set; }
    public List<string> DialInNumbers { get; set; }
}

您的實體只有標量屬性。 這意味着它沒有引用另一個實體。 在您的特定情況下,屬性DialInNumbers是一個字符串列表,而不是實體列表。 實體框架將導航屬性轉換為表關系,現在情況並非如此。

如果確實要有一個DialInNumbers表,則需要一個DialNumber列表。

public class Conference
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string OwnerName { get; set; }
    public List<DialNumber> DialInNumbers { get; set; }
}

public Class DialNumber
{
    public string Number{get;set;}
    public int ConferenceId{get;set;}
    public Conference Conference{get;set;}
}

您需要在配置類中為導航屬性配置實體。

modelBuilder
   .Entity<DialNumber>()
   .HasRequired(p => p.Conference);

如果要使用具有ID的實體,則需要將DialNumber修改為:

public Class DialNumber
{
    public string Number{get;set;}
    public Conference Conference{get;set;}
}

modelBuilder
   .Entity<DialNumber>()
   .HasRequired(p => p.Conference);
   .WithMany(b => b.DialNumber)
   .HasForeignKey(p => p.ConferenceId);

這將使您以后減少附加實體的開銷,並使您的外鍵以所需的方式命名,在這種情況下,ConferenceId而不是將產生的默認語法(如第一種情況)“ Conference_Id ”。

暫無
暫無

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

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