2013-05-15 350 views
1

我有一個帶有2個外鍵的表到同一個父表Edge.StartStationId和Edge.EndStationId。實體框架多對象關係

我想映射到實體框架obesets,但無法找到解決方法,似乎解決了這個問題。 我發現使用父(站)2個集合了一些解決方案,我不感興趣,

站(父)類:

public partial class Station 
{ 
    public Station() 
    { 
     this.Reservations = new List<Reservation>(); 
     this.StationMaintenances = new List<StationMaintenance>(); 
    } 

    public int ID { get; set; } 
    public int TypeId { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public decimal StationLat { get; set; } 
    public decimal StationLong { get; set; } 
    public bool IsOperational { get; set; } 
    public bool IsActive { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public virtual BatteryStorage BatteryStorages { get; set; } 
    public virtual List<Reservation> Reservations { get; set; } 
    public virtual List<StationMaintenance> StationMaintenances { get; set; } 
    public virtual List<Edge> Edges { get; set; } 
    public virtual StationType StationType { get; set; } 
} 

邊緣(子)類:

public partial class Edge 
{ 
    public int ID { get; set; } 
    public int StartStationId { get; set; } 
    public virtual Station StartStation { get; set; } 
    public int EndStationId { get; set; } 
    public virtual Station EndStation { get; set; } 
    public decimal Distance { get; set; } 
    public decimal Time { get; set; } 
    public bool IsActive { get; set; } 
} 

在OnModelCreating中添加的邊緣貼圖類。

public EdgeMap() 
{ 
    // Primary Key 
    this.HasKey(t => t.ID); 

    // Properties 
    // Table & Column Mappings 
    this.ToTable("Edges"); 
    this.Property(t => t.ID).HasColumnName("ID"); 
    this.Property(t => t.StartStationId).HasColumnName("StartStationId"); 
    this.Property(t => t.EndStationId).HasColumnName("EndStationId"); 
    this.Property(t => t.Distance).HasColumnName("Distance"); 
    this.Property(t => t.Time).HasColumnName("Time"); 
    this.Property(t => t.IsActive).HasColumnName("IsActive"); 

    // Relationships 
    //this.HasOptional(t => t.StartStation) 
    // .WithMany(t => t.Edges) 
    // .HasForeignKey(d => d.StarStationId); 
    //this.HasOptional(t => t.EndStation) 
    // .WithMany(t => t.Edges) 
    // .HasForeignKey(d => d.EndStationId); 
} 

例外:模型生成過程中檢測到

一個或多個驗證錯誤: System.Data.Entity.Edm.EdmAssociationType:與角色「Edge_EndStation_Target」在參考約束多重衝突關係'Edge_EndStation'。由於從屬角色中的所有屬性都是不可空的,所以主體角色的多重性必須爲'1'。

+1

我認爲當持續更改Edges集合時EF可能會感到困惑,所以我不認爲EF會讓你這樣做。我認爲你最終可能會收到兩個邊緣集合或一個非虛擬邊緣集合,您可以手動加載電臺集合的邊緣。 – hazimdikenli

回答

1

我認爲你發佈的特定錯誤是抱怨HasOptional。由於外鍵(StartStationIdEndStationId)是不可空的,因此需要映射。嘗試將其更改爲HasRequired,或將StartStationIdEndStationId的類型更改爲int?,以便它知道導航屬性可以爲空。

至於Edges集合,它應該包含什麼?任何Edge參考StationStartStationIdEndStationId值?如果是這樣,我不認爲你可以用一個集合做到這一點。

+0

邊緣集合應包含StationId等於StartStationId的邊。如何,如你所說,這可能不是我想要的。我最終從Edge中刪除了StartStation對象,並且僅添加了對EndStation的引用。 – KLIM8D

+0

我認爲這應該是可能的。如果你仍然在做這件事,試試像'this.HasOptional(t => t.StartStation).WithMany(t => t.Edges).HasForeignKey(d => d.StartStationId);'然後'this .HasOptional(t => EndStation).WithMany()。HasForeignKey(d => d.EndStationId)'。 –