實體框架7 Fluent API無法識別IsOptional()

ef-fluent-api entity-framework entity-framework-core

我正在使用實體框架7在我的Asp.Net 5項目中設置我的數據庫,以前使用EF 6,當我想讓我的一些列可以為空時,我會使用:

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();

但似乎IsOptional不再是IsOptional的一部分了,我想知道如何使用EF7實現相同的功能?

編輯: Marc的答案確實是正確的,首先我雖然它有效,因為我找到了像IsOptional東西:

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();

但是在沒有它的情況下運行一些測試後,它將數據庫列設置為可空,因為我在域模型中將其標記為可為空:

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();

另外值得注意的是,當我使DateTime不可為空並使用IsRequired(false) ,我收到以下錯誤:

實體類型“Article”上的屬性“ArticleDateModified”不能標記為nullable / optional,因為屬性的類型是“DateTime”,它不是可空類型。任何屬性都可以標記為不可為空/必需,但只有可空類型的屬性和不屬於主鍵的屬性可以標記為可空/可選。

所以,我想知道IsRequired(false)在這裡的用途是什麼,如果要使數據庫列可以為空,我要做的就是讓它在我的域類中可以為空?

一般承認的答案

根據本文檔頁面中的說明 ,似乎取消了以聲明方式執行此操作的支持。以機智:

CLR類型不能包含null的屬性不能配置為可選。實體框架始終認為該屬性是必需的。

這是有意的,可以在GitHub上託管項目的設計討論中看到, 具體來說

也就是說,標記為可空的屬性支持空值,而標記為非可空的屬性必須永遠不能包含空值。由此得出,不允許將具有不可空CLR類型的屬性標記為允許空值。 這與允許這樣做的EF6行為不同。 [重點補充]


結果是,在EF7中, NULL列嚴格意味著可以為空的映射屬性。如果您的屬性可以為空,則關聯列必須為NULL除非您使用IsRequired標記或配置它。


對OP編輯的回應

這很有意思,我最初沒有看到關於IsRequired(bool) API的文檔。我在一些六月發現了一個討論點就可以了會議記錄表明這個 EF6的相當於IsOptional()

.IsOptional() - 我們將通過調用Required(false)提供此功能
.IsRequired() - 為Required()提供相同的功能

即使這是最初的意圖,取消支持的設計決定可以追溯到10月份。 (每次更新)嘗試在非可空屬性上設置IsRequired(false)導致運行時錯誤,而不是完全刪除。

雖然現在是多餘的,但是在不破壞有效代碼的情況下無法刪除API:它沒有使用單獨的IsRequired(bool)IsRequired()定義實現,而是使用單個IsRequired(bool required = true) 。如果它被刪除並替換為無參數版本,那將是一個重大變化。


熱門答案

Em ...聲明屬性可以為空?

class Article
{
    public DateTime? ArticleDateModified {get;set;}
}



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因