当前位置:  开发笔记 > 后端 > 正文

实体框架7 Fluent API无法识别IsOptional()

如何解决《实体框架7FluentAPI无法识别IsOptional()》经验,为你挑选了1个好方法。

我正在使用实体框架7在我的Asp.Net 5项目中设置我的数据库,以前使用EF 6,当我想让我的一些列可以为空时,我会使用:

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

但似乎IsOptional不再是EF7的一部分,我想知道如何使用EF7实现同样的目标?

编辑: 马克的答案确实是正确的,首先我虽然它有效,因为我找到了类似的东西IsOptional:

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

但是在没有它的情况下运行一些测试后,它将数据库列设置为可空,因为我在域模型中将其标记为可为空:

public DateTime? ArticleDateModified { get; set; }

另外值得注意的是,当我使用DateTime非可空并使用时IsRequired(false),我收到以下错误:

实体类型"Article"上的属性"ArticleDateModified"不能标记为nullable/optional,因为属性的类型是"DateTime",它不是可空类型.任何属性都可以标记为不可为空/必需,但只有可空类型的属性和不属于主键的属性可以标记为可空/可选.

所以,我想知道在IsRequired(false)这里有什么用,如果我要做的一件事就是让数据库列可以为空,那么在我的域类中它是否可以为空?



1> Marc L...:

根据本文档页面中的说明,似乎取消了以声明方式执行此操作的支持.以机智:

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).如果它被删除并替换为无参数版本,那将是一个重大变化.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有