[英]How do I configure Entity Framework cascade delete to work properly with a one to many relationship?
[英]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; }
}
然后,在Controller
( ConferenceController
)中,我們可以Create
和Edit
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.