我有兩個實體,用戶和反饋,並且在用戶名字段的幫助下有一對一的關係。如何防止代碼優先啓用關係上的外鍵約束?
Feedback --> User
-------- --------
username username
但是,有時反饋可能來自未註冊用戶的代碼,並且反饋的用戶名字段將爲空。在這種情況下,由於外鍵約束,添加反饋將失敗。
如何以聲明方式或通過Fluent API禁用關係上的外鍵約束強制?在創建數據庫時默認啓用。
謝謝!
我有兩個實體,用戶和反饋,並且在用戶名字段的幫助下有一對一的關係。如何防止代碼優先啓用關係上的外鍵約束?
Feedback --> User
-------- --------
username username
但是,有時反饋可能來自未註冊用戶的代碼,並且反饋的用戶名字段將爲空。在這種情況下,由於外鍵約束,添加反饋將失敗。
如何以聲明方式或通過Fluent API禁用關係上的外鍵約束強制?在創建數據庫時默認啓用。
謝謝!
您不需要針對您的目的禁用外鍵約束的強制實施,您只需要允許將外鍵的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);
非常感謝您的回覆。如果我的主鍵(用戶名)是字符串,並且不能設爲空,會怎麼樣?當我指定「public String?Username」時,出現以下編譯錯誤:類型'string'必須是不可爲null的值類型,以便將其用作泛型類型或方法'System.Nullable'中的參數'T'
@AlexAvrutin:'String'是一個引用類型,因此默認情況下允許'null'。你不需要添加'?'。 – Slauma 2012-04-27 10:29:26
但是,如果我不添加?,我得到默認啓用關係的外鍵約束。我想避免這種情況。我希望你提到的Fluent API方法能幫助我? – 2012-04-27 19:28:23
我也在尋找一個答案,這個確切的問題。 – Chalky 2017-09-27 10:05:43