2011-11-21 184 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