4

Я сейчас настраиваю свою базу данных в своем проекте Asp.Net 5, используя сущность framework 7, ранее с EF 6, когда я хотел сделать некоторые из моих столбцов нулевыми , я хотел бы использовать:Entity Framework 7 Fluent API не распознает IsOptional()

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

Но мне кажется, что IsOptional не является частью EF7 больше, мне было интересно, как я могу достичь того же с помощью EF7?

Edit: ответ Marc является действительно правильным, первый я, хотя это сработало, потому что я нашел то, что было как IsOptional:

builder.Entity<Article>().Property(t => t.ArticleDateModified).IsRequired(false); 

Но после того, как я провел некоторое испытание без него установить столбец базы данных обнуляемые потому, что я отметил, что, как обнуляемые в моей модели предметной области:

public DateTime? ArticleDateModified { get; set; } 

также стоит отметить, что, когда я сделал DateTime ненулевое и использовал т Хэ IsRequired(false), я получил следующее сообщение об ошибке:

The property 'ArticleDateModified' on entity type 'Article' cannot be marked as nullable/optional because the type of the property is 'DateTime' which is not a nullable type. Any property can be marked as non-nullable/required, but only properties of nullable types and which are not part of primary key can be marked as nullable/optional.

так, интересно, что является использование IsRequired(false) здесь, если все, что я должен сделать, чтобы сделать столбец базы данных обнуляемым, чтобы сделать его обнуляемым в моем классе домена?

+0

Я ответил несколько исследований, но сначала я должен был спросить: можете ли вы проверить гипотезу, удалив значение nullability из «ArticleDateModified» и увидев, что сгенерировано в БД при сопоставлении с «IsRequired (false)»? Если столбец равен нулю, независимо от того, что они решили в октябре, тот факт, что они построили его на основе июньского проектного решения, превзойдет решение октября, по крайней мере, до следующего выпуска основной версии, поскольку (технически) RTM API не изменится от RC1, и удаление или отключение API будет изменением. Если столбец не равен NULL, то он уже отключен. –

+0

@MarcL. Я отредактировал вопрос с ответом. –

ответ

5

Основываясь на банкноте в этом documentation page, казалось бы, что поддержка делать это декларативно была отменена. Для остроумие:

A property whose CLR type cannot contain null cannot be configured as optional. The property will always be considered required by Entity Framework.

То, что это было намеренное можно увидеть в проектных дискуссий по проекту хостинг на GitHub, specifically:

That is, a property marked as nullable supports null values, while a property marked as non-nullable must never contain null values. It follows from this that marking a property which is of a non-nullable CLR type as allowing nulls will not be allowed. This is different from the EF6 behavior where this is allowed. [emphasis added]


Кончилось это, в EF7 NULL колонна строго подразумевает свойство с нулевым отображением. Если ваше свойство имеет значение NULL, соответствующий столбец должен быть NULL, если вы не отметили его или не сконфигурировали с помощью IsRequired.


Ответ на OP редактирует

Это интересно, я первоначально не содержится в документации на IsRequired(bool) API. Я нашел точку на обсуждение, в некотором июне meeting notes, что заявить, что это бы быть эквивалентом EF6-х IsOptional():

.IsOptional() - We'll provide this functionality via calling Required(false)
.IsRequired() - Provide Required() with the same functionality

Несмотря на то, что это первоначальное намерение, дизайнерское решение отменить даты поддержки с октября. (За обновление), пытающееся установить IsRequired(false) на свойство, не допускающее nullable, приводит к ошибке во время выполнения, а не полностью удалено.

Хотя теперь излишни, то API не может быть удален без нарушения правильного кода: он не был реализован с отдельными IsRequired(bool) и IsRequired() определений, но с одним IsRequired(bool required = true). Если бы он был удален и заменен беззадачной версией, это было бы изменением.

3

Em ... Объявить свойство как nullable?

class Article 
{ 
    public DateTime? ArticleDateModified {get;set;} 
} 
Смежные вопросы