2011-11-21 182 views
0

我试图创建一列MVC列车旅行(除其他事项),使用代码第一个实体框架,并想知道如何我可以映射外部站点的外键。 Journey型号/表格将有一个DepartureStationID和一个ArrivalStationID这将是外键链接到一个表/模型,称为StationMVC3模型设置 - 代码优先EF

下面是这两种模式的代码:

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关系是电台表和上述两个领域之间的,而不是DepartureIDArrivalID

所以,我的问题是 - 当两个字段引用同一个表时,是否需要在模型中做一些不同的事情?我不知道为什么添加这些额外的字段,所以我认为我错误地设置了模型。

感谢

回答

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); 
    } 
} 

编辑:为了解决您的关于级联删除上面的评论,你可以.HasForeignKey()之后添加.WillCascadeOnDelete(false)以及可能帮助(虽然你那么必须手动删除记录之旅)

+0

嗨宽容,非常感谢 - 这解决了我。通过添加你写的东西,再加上'.WillCascadeOnDelete(false)'的选项,它可以对初始错误和Cascade问题进行排序。优秀。 –

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; } 
} 

当然,你需要重新生成数据库,以应用新的配置。

希望这会有所帮助。

+0

Haythem您好,感谢 - 这看起来不错。不幸的是,它引入了这个错误:在表'旅程'中引入FOREIGN KEY约束'Journey_DepartureStation'可能会导致周期或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或者修改其他FOREIGN KEY约束。“我会去查看这个错误并尝试找出并报告回去...... –

+0

请参阅我的帖子以获取可能的修正。多级联路径错误对于SQL Server来说是一件烦人的事情 - 它们对此非常保守,而其他数据库无论如何都会删除。这可能来自于旅途中指向站台的两个物业。删除cascade-on-deletes并手动处理。 – Leniency