[英]Why is Entity Framework generating the [Required] attribute on my computed column?
简化的示例:我有一个计算列定义为Azure SQL服务器表中的字段。
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
)
但是,当我在Visual Studio 2017中生成代码优先的ADO.NET实体数据模型时,将同时使用[Required]
和[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
属性生成该属性。
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[Required]
[StringLength(19)]
public string MyComputedColumn { get; set; }
当然,这会导致实体验证错误和其他各种问题。
当EF也知道此属性是计算字段时,为什么将其标记为[Required]
?
我知道我可以删除属性,但是我正在寻找一种更清洁的解决方案,而不是每次重新生成实体模型时都[Required]
从所有计算列中手动删除[Required]
属性。 例如,我可以在SQL中声明不同的列吗?
即使我们知道您所使用的逻辑永远不能将计算列设为null,但EF并不是那么聪明,因此即使计算列永远不会为null,也应使它为可为空。
感谢@Shan的评论,让我朝着正确的方向前进:
根据MyComputedColumn的逻辑,其不为null,因此EF将其标记为必需。
我不能像其他人建议的那样将列设为NULLABLE,所以我不得不向计算列添加不可能的NULL情况:
[MyComputedColumn] AS CASE
WHEN 2 = 1 THEN NULL
WHEN [CancelledOn] IS NOT NULL THEN 'Cancelled'
ELSE 'Draft' END
这有点骇人听闻,我希望EF更智能,但是它不再生成[Required]
,因此它可以满足我的目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.