MVC EF Code首先一对一关系错误

时间:2012-08-25 13:36:25

标签: asp.net asp.net-mvc asp.net-mvc-3 entity-framework model

我希望有一份展台清单(在贸易展览会上)和参展商名单。

展台名单与参展商名单分开 - 但是,一旦注册,我希望参展商能够预订展位。

当他们选择/预订展位时 - 我希望能够在我的视图中列出展位列表,并展示已预订展位的相关参展商。

同样,我想在另一个视图中列出参展商,以及他们预订的展位。

所以我试图建立一对一的关系(使用EF CodeFirst)。

但是,当试图为展台或参展商添加控制器时,我收到以下错误:

enter image description here

我的模特是:

 public class Stand
{
    public int StandID { get; set; }
    public string Description { get; set; }
    public bool Booked { get; set; }
    public int ExhibitorID { get; set; }
    public virtual Exhibitor Exhibitor { get; set; }

}

 public class Exhibitor
{
    public int ExhibitorID { get; set; }
    public string Company { get; set; }
    public int StandID { get; set; }
    public virtual Stand Stand { get; set; }

}

我确定这与模特的“虚拟”部分有关。

任何人都可以帮助指出应该更新的内容,以便进行连接吗?

谢谢,

标记

2 个答案:

答案 0 :(得分:5)

EF不知道哪个实体是主体(父),哪个是依赖(子)。您需要在应该首先出现的实体的项目上声明外键。您可以使用注释或流畅的映射来完成此操作。

<强>注释

添加以下命名空间:

using System.ComponentModel.DataAnnotations.Schema;

使用以下注释注释您的Stand课程:

public class Stand
{
    [ForeignKey("Exhibitor")]
    public int StandID { get; set; }
    public string Description { get; set; }
    public bool Booked { get; set; }
    public int ExhibitorID { get; set; }
    public virtual Exhibitor Exhibitor { get; set; }

}

Fluent Mapping

覆盖OnModelCreating课程中的DbContext方法,以包含:

modelBuilder.Entity<Stand>()
    .HasOptional(s => s.Exhibitor)
    .WithRequired(e => e.Stand);

答案 1 :(得分:3)

您创建的模型无法与关系数据库一起使用。 Stand需要ExibitorIdExibitor需要StandId。循环关系不允许您向任何表插入任何行。

假设Exibitor可能有多个Stand并且将关系转换为一对多是一个选项。

public class Stand
{
    public int StandID { get; set; }
    public string Description { get; set; }
    public bool Booked { get; set; }
    public int? ExhibitorID { get; set; }
    public virtual Exhibitor Exhibitor { get; set; }    
}

public class Exhibitor
{
    public int ExhibitorID { get; set; }
    public string Company { get; set; }
    public virtual ICollection<Stand> Stands { get; set; }
}

或者您可以使用共享主键映射来实现一对一的关系。其中Stand是主要实体。 Exibitor将使用StandID作为其PK。

public class Stand
{
    public int StandID { get; set; }
    public string Description { get; set; }
    public bool Booked { get; set; }
    public virtual Exhibitor Exhibitor { get; set; }
}

public class Exhibitor
{
    public int ExhibitorID { get; set; }
    public string Company { get; set; }
    public virtual Stand Stand { get; set; }
}

使用Fluent API配置关系。

modelBuilder.Entity<Exibitor>().HasRequired(e => e.Stand)
    .WithOptional(s => s.Exibitor);