2

如何在 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) 中,我们可以CreateEdita 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. 如何获取多个表以及如何在实体框架中将它们链接在一起?

谢谢你。

4

2 回答 2

4

您不能在实体和字符串之间定义 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属性应该是虚拟的

于 2013-10-20T07:59:02.413 回答
0
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 ”。

于 2013-10-21T18:15:56.510 回答