2017-07-28 35 views
1

我的域模型是Trade可以有很多TradeLeg s。我正在嘗試使用以下映射。在Entity Framework 6中,如何創建一個具有導航屬性的另一方的一對多映射?

貿易映射

HasKey(t => t.TradeId); 
Property(t => t.TradeId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 
    .HasColumnName("TradeId");          
Property(t => t.Description).HasColumnName("Description"); 
Property(t => t.CounterpartyId).HasColumnName("CounterpartyId"); 
Property(t => t.Quantity).HasColumnName("Quantity"); 
Property(t => t.IsActive).HasColumnName("IsActive"); 

HasMany(t => t.TradeLegs); 

ToTable("Trade"); 

貿易腿映射

HasKey(t => t.TradeLegId); 
Property(t => t.TradeLegId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 
    .HasColumnName("TradeLegId");          
Property(t => t.TrdId).HasColumnName("TrdId"); // FK back to trade 
Property(t => t.Ordinal).HasColumnName("Ordinal"); 
Property(t => t.Description).HasColumnName("Description"); 

ToTable("TradeLeg");   

當我嘗試選擇一些行業我得到的錯誤時拋出。

列名無效Trade_TradeId

我可以把它加在TradeLeg導航屬性回到貿易和增加.WithRequired(u => u.Trade).HasForeignKey(u =>u.TrdId)HasMany()映射Trade對象上工作。

但是,我不想有TradeLeg導航屬性返回Trade。我只想在TradeLeg上有一個int FK屬性(TrdId)。我還注意到,如果我使用TradeId而不是TrdId作爲TradeLeg上的FK屬性,那麼它也會因默認規則而起作用。有沒有辦法告知EF HasMany()另一側的FK字段的名稱。

回答

1

該映射應該爲你工作Trade使用HasMany()的對象。像下面的東西應該工作。

HasMany(t => t.TradeLegs) 
    .WithRequired() //use WithOptional for optional no need to specify the mapping on the other side. 
    .HasForeignKey(leg => leg.TrdId); 

我只是在我的映射對象的一個​​測試,這在EF6,似乎工作。

此相同的概念可以工作的其他方式,當你想一到,很多的孩子沒有父導航屬性如

HasRequired(x => x.Property) 
    .WithMany() //no need to specify the navigation property on the other side 
    .HasForeignKey(x=> x.ForeignKeyProperty); 
+0

非常感謝的快速反應。我已經嘗試在兩側都存在導航屬性的情況下,在兩側都使用空與子句,並且一切似乎按預期工作。將反向導航屬性添加到with子句有什麼好處?如果不是,我可能會在一週之內離開with子句總是空的。 – Shane

+0

國際海事組織我嘗試和明確表達如何設置導航屬性,並通過省略他們我告訴其他開發人員(和我自己),故意沒有反向導航屬性。現在有些情況下,反過來可能有多個「可以」導航的屬性。假設一個實體對兩個相同類型的實體有一個導航屬性。這不會沒有指定您的實際屬性。一個例子是一個孩子的兩個(可選)父實體。如果你有'ParentA'和'ParentB'兩個相同的類型,那麼如果沒有導航屬性設置,這將無法正常工作。 – Nico

+0

爲了傳達意圖而採取的一點,但在你提到的情況下,我認爲應該可以對父母雙方都有導航屬性,並且在映射中仍然有空的子句,但是當你嘗試去做時可能會出現問題用linq查詢,你想引用相關的實體。你是這個意思嗎? – Shane

相關問題