2012-04-25 58 views
0

我有兩個實體,用戶和反饋,並且在用戶名字段的幫助下有一對一的關係。如何防止代碼優先啓用關係上的外鍵約束?

Feedback --> User 
-------- -------- 
username username 

但是,有時反饋可能來自未註冊用戶的代碼,並且反饋的用戶名字段將爲空。在這種情況下,由於外鍵約束,添加反饋將失敗。

如何以聲明方式或通過Fluent API禁用關係上的外鍵約束強制?在創建數據庫時默認啓用。

謝謝!

+0

我也在尋找一個答案,這個確切的問題。 – Chalky 2017-09-27 10:05:43

回答

4

您不需要針對您的目的禁用外鍵約束的強制實施,您只需要允許將外鍵的NULL值稱爲可選的一對多關係(與一個需要關係,它不允許外鍵的NULL值)。

可以定義這個可選的關係的方式如下:

public class Feedback 
{ 
    public int Id { get; set; } 

    [ForeignKey("User")] 
    public int? UserId { get; set; } 
    public User User { get; set; } 
} 

有外鍵可空類型int?使關係可選。如果User具有名爲Id的主鍵屬性,則甚至可以省略[ForeignKey]屬性,因爲實體框架將根據命名約定檢測UserId作爲User導航屬性的外鍵。

或者以代替數據註解,你可以使用流利的API:

modelBuilder.Entity<Feedback>() 
    .HasOptional(f => f.User) 
    .WithMany() // or WithMany(u => u.Feedbacks) 
    .HasForeignKey(f => f.UserId); 
+1

非常感謝您的回覆。如果我的主鍵(用戶名)是字符串,並且不能設爲空,會怎麼樣?當我指定「public String?Username」時,出現以下編譯錯誤:類型'string'必須是不可爲null的值類型,以便將其用作泛型類型或方法'System.Nullable'中的參數'T' '。 – 2012-04-27 02:55:45

+0

@AlexAvrutin:'String'是一個引用類型,因此默認情況下允許'null'。你不需要添加'?'。 – Slauma 2012-04-27 10:29:26

+1

但是,如果我不添加?,我得到默認啓用關係的外鍵約束。我想避免這種情況。我希望你提到的Fluent API方法能幫助我? – 2012-04-27 19:28:23