繁体   English   中英

为什么实体框架会在我的计算列上生成[Required]属性?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM