我正在尝试使用代码优先实体框架创建MVC中的列车行程列表(以及其他内容),并且想知道如何为站点映射外键。 Journey
模型/表格将包含DepartureStationID
和ArrivalStationID
,它们是链接到一个表/模型的外键,称为Station
。
以下是这两个模型的代码:
public class Station
{
public int StationID { get; set; }
public string StationName { get; set; }
public string StationLocation { get; set; }
}
public class Journey
{
public int JourneyID { get; set; }
public int DepartureID { get; set; }
public int ArrivalID { get; set; }
public int OperatorID { get; set; }
public string JourneyCode { get; set; }
public virtual Operator Operator { get; set; }
public virtual Station DepartureStation { get; set; }
public virtual Station ArrivalStation { get; set; }
}
其中有另一个外键值,即Operator
,并且已成功映射,但出发和到达没有,并在视图中返回空值:(@Html.DisplayFor(modelItem => item.DepartureStation.StationName)
。
当我查看数据库时,EF创建了另外两个字段:
DepartureStation_StationID
ArrivalStation_StationID
SQL关系是在工作台和上面的两个字段之间,而不是DepartureID
和ArrivalID
所以,我的问题是 - 在引用两个字段的同一个表时,我是否需要在模型中做一些不同的事情?我不知道为什么添加这些附加字段所以我认为我已经错误地设置了模型。
由于
答案 0 :(得分:3)
在导航属性中添加以下属性:
public class Journey
{
public int JourneyID { get; set; }
public int DepartureID { get; set; }
public int ArrivalID { get; set; }
public int OperatorID { get; set; }
public string JourneyCode { get; set; }
[ForeignKey("OperatorID")]
public virtual Operator Operator { get; set; }
[ForeignKey("DepartureID")]
public virtual Station DepartureStation { get; set; }
[ForeignKey("ArrivalID")]
public virtual Station ArrivalStation { get; set; }
}
当然,您需要重新生成数据库才能应用新配置。
希望这会有所帮助。
答案 1 :(得分:3)
为了完整性,这里的流畅配置也是如此。
public class MyDb : DbContext
{
public DbSet<Journey> Journeys { get; set; }
public DbSet<Operator> Operators { get; set; }
public DbSet<Station> Stations { get; set; }
protected override void OnModelCreating(DbModelBuilder builder)
{
builder.Entity<Journey>()
.HasRequired(j => j.DepartureStation)
.WithMany()
.HasForeignKey(j => j.DepartureID);
builder.Entity<Journey>()
.HasRequired(j => j.ArrivalStation)
.WithMany()
.HasForeignKey(j => j.ArrivalId);
// ... Same thing for operator ...
base.OnModelCreating(builder);
}
}
修改:要解决有关级联删除的上述评论,您可以在.WillCascadeOnDelete(false)
之后添加.HasForeignKey()
,这可能有所帮助(尽管您必须手动删除旅程记录)