繁体   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