2016-08-19 43 views
0

我正在嘗試將EF 6模型遷移到EF 7,但我被困在一點上。我嘗試了幾個人的建議無濟於事。如何在EF 7流體建模中表達這種1對1?

這是屬性爲EF 6表示:

modelBuilder.Entity<StockItem>() 
    .HasOptional(e => e.StockItemHolding) 
    .WithRequired(e => e.StockItem); 

通過這樣的代碼,我收到以下錯誤:

Error CS1061 'EntityTypeBuilder' does not contain a definition for 'HasOptional' and no extension method 'HasOptional' accepting a first argument of type 'EntityTypeBuilder' could be found (are you missing a using directive or an assembly reference?)

我檢查了文件和WithRequired是問題。它已被WithOne取代。許多一對多的關係很好的工作,像這樣的:

modelBuilder.Entity<StockItem>() 
    .HasMany(e => e.StockItemTransactions) 
    .WithOne(e => e.StockItem).IsRequired() 
    .OnDelete(DeleteBehavior.Restrict); 
+1

究竟正在面臨的問題? – bhuvin

+0

'HasOne'呢? –

+0

謝謝@GertArnold。這是非常複雜的,所以我不確定它會起作用,但是它會編譯並且你贏了。回答,我會接受。 – ProfK

回答

0

在EF核心流利API Required/Optional(以及Dependent/Principal)是的Has/With方法沒有更多的部分。它們已被HasOne/WithOneIsRequired結合替代。

但是,在EF Core中還有一些其他有關one-to-one關係的重要細節。

首先,IsRequired只適用於從屬實體,即從主體一方的關係總是可選的。其次,您需要指定從屬外鍵,這可能是PK或單獨的字段(顯式或陰影)。

因此,對於上述EF6配置(創建Shared Primary Key Association)相當於EF核心配置是這樣的(假設StockItemHolding PK被稱爲Id):

modelBuilder.Entity<StockItem>() 
    .HasOne(e => e.StockItemHolding) 
    .WithOne(e => e.StockItem) 
    .HasForeignKey<StockItemHolding>(e => e.Id); 
+0

或'.HasPrincipalKey (i => i.ID);'其中'ID'是'StockItem'的PK。我只是開始研究EF核心,現在看起來足夠穩定,使它值得花時間和精力。順便解釋一下!也許值得注意的是,令我驚訝的是,''StockItem.StockItemHolding''不能像EF6那樣使用數據註釋來進行驗證。 (儘管在這裏,這並不重要)。 –

+0

@GertArnold Hi Gert。關於看EF核心,這裏一樣:)仍然不夠穩定恕我直言(主要是左外連接問題)。在SQL和內存之間分割執行的想法很有趣(基本上應該避免不受支持的異常),但對於像我這樣的人來說,不希望像在內存中讀整個表一樣的驚喜,這有點令人害怕。幸運的是它是可配置的。無論如何,無法在db中強制執行所需的依賴項。 –

+0

當然,我希望客戶評估錯誤(而不是警告)是默認的。這是正確的,所需的依賴不能由數據庫強制執行(基本上是因爲同時插入不存在),但在某些情況下,客戶端驗證可能有所幫助。 –