【发布时间】:2021-01-19 17:39:55
【问题描述】:
我正在使用 Entity Framework Core 3.1.7 并创建了一个名为 Event 的实体,我是这样设置的:
public class Event
{
public long Id { get; set; }
public DateTimeOffset FirstOccurred { get; set; }
}
实体配置如下:
builder.Property(e => e.FirstOccurred)
.IsRequired();
我使用我的dbContext 来保存这样的实体:
await dbContext.Events.AddAsync(new Event());
在这种情况下,我错误地预期会在数据库级别引发异常,因为该值不能为空。
实际发生的情况是:实体很高兴地将FirstOccurred 设置为0001-01-01T00:00:00+00:00
这是有道理的,因为使用了默认值DateTimeOffset。
现在我的问题是:如何改进我的设计以防止插入此默认值?
我已经有了一些想法:
- 保持上面的代码不变,但请确保无论在何处使用实体,我都正确设置了值。缺点:无法保证随着时间的推移,这将在团队中始终如一地应用。
- 使
DateTimeOffset可以为空,这在上面的AddAsync()调用中实际上会导致SQL 异常。缺点:乍一看,DateTimeOffset? FirstOccurred可能会让人感到困惑,因为实际的数据库约束不允许 null - 为
FirstOccurred删除set;并创建一个需要设置此属性的构造函数,例如new Event(DateTimeOffset.Now)
【问题讨论】:
-
“我希望在数据库级别引发异常,因为该值不能为空。”不过,它不是空的。您已经创建了一个
Event的新实例,它声明了它的FirstOccurred属性。由于该属性不可为空,因此将其设置为default(DateTimeOffset)。 -
是的,你是对的。我将稍微改写我的假设,以澄清我在这里想说的话。谢谢
标签: entity-framework-core entity-framework-core-3.1