我希望有一份展台清单(在贸易展览会上)和参展商名单。
展台名单与参展商名单分开 - 但是,一旦注册,我希望参展商能够预订展位。
当他们选择/预订展位时 - 我希望能够在我的视图中列出展位列表,并展示已预订展位的相关参展商。
同样,我想在另一个视图中列出参展商,以及他们预订的展位。
所以我试图建立一对一的关系(使用EF CodeFirst)。
但是,当试图为展台或参展商添加控制器时,我收到以下错误:
我的模特是:
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; }
}
我确定这与模特的“虚拟”部分有关。
任何人都可以帮助指出应该更新的内容,以便进行连接吗?
谢谢,
标记
答案 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
需要ExibitorId
而Exibitor
需要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);