[英]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.