Почему Entity Framework генерирует атрибут [Required] в моем вычисляемом столбце? - PullRequest
1 голос
/ 31 мая 2019

Упрощенный пример: у меня есть вычисляемый столбец, определенный как поле в моей таблице SQL-сервера Azure.

CREATE TABLE [dbo].[MyTable] 
(
  [Id] INT NOT NULL PRIMARY KEY IDENTITY,
  [CancelledOn] DATETIME NULL,
  [MyComputedColumn] AS CASE WHEN ([CancelledOn] IS NOT NULL) THEN 'Cancelled' ELSE 'Draft' END
)

Но когда я генерирую первую модель ADO.NET Entity Data Model в Visual Studio 2017, свойство генерируется с атрибутами [Required] и [DatabaseGenerated(DatabaseGeneratedOption.Computed)].

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[Required]
[StringLength(19)]
public string MyComputedColumn { get; set; }

Конечно, это вызывает ошибки проверки сущности и другие проблемы.

Почему EF помечает это свойство как [Required], когда оно также знает, что это вычисляемое поле?

Я понимаю, что могу просто удалить атрибут, но я ищу более чистое решение, чем необходимость вручную удалять атрибут [Required] из всех моих вычисляемых столбцов каждый раз, когда я воссоздаю свою модель сущности. Могу ли я объявить столбец по-другому в SQL, например?

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Спасибо комментарию @ Shan за то, что подтолкнули меня в правильном направлении:

По логике MyComputedColumn он не равен нулю, поэтому EF пометил его как требуется.

Я не мог просто сделать столбец NULLABLE, как предлагали другие, поэтому мне пришлось добавить невозможный случай NULL в вычисляемый столбец:

[MyComputedColumn] AS CASE 
  WHEN 2 = 1 THEN NULL 
  WHEN [CancelledOn] IS NOT NULL THEN 'Cancelled' 
  ELSE 'Draft' END

Это что-то вроде хака, и я хотел бы, чтобы EF был умнее, но он больше не генерирует [Required], поэтому он работает для моих целей.

0 голосов
/ 31 мая 2019

Несмотря на то, что мы знаем, что вычисляемый столбец никогда не может быть нулевым из-за используемой вами логики, EF не настолько умен, поэтому вы должны сделать вычисляемый столбец обнуляемым, даже если он никогда не будет нулевым.

...