实体框架Core 2.x默认值

时间:2018-04-19 15:48:45

标签: .net-core entity-framework-core

在官方文档中,我可以看到在我的模型的属性上设置默认值,它只能通过Fluent API(没有数据注释)。

modelBuilder.Entity<Blog>()
            .Property(b => b.Rating)
            .HasDefaultValue(3);

在另一方面,我在视频教程中看到作者在同一属性中设置了默认值:

public int Rating { get; set; } = 3;

我测试了两个相同的结果。使用第二种方法是正确的吗? 什么更好?

提前致谢

2 个答案:

答案 0 :(得分:0)

这些完全不相关。第一个是在表中创建新记录时将使用的默认列值,并且未向该列显式指定值。第二个是类'property。

的默认值

答案 1 :(得分:0)

当您使用HasDefaultValue API时,您正在配置数据库,以便在INSERT语句期间未提供任何值时生成值。无论您使用EF还是原始SQL,还是直接在SSMS中写入insert语句,都会生成该值。

在CLR类型中设置默认值时,您的数据库将无法配置。因此,代替服务器生成值,您实际上是在客户端上生成值。在未设置评级的情况下初始化新博客时,除非另行设置,否则EF将保存为3的值,EF将保存到数据库。此客户端生成意味着您需要在insert语句中包含Rating列,并在插入记录时从客户端提供值。

什么更好?

完全取决于用例和价值生成。如果您没有在EF之外插入数据,那么它只会更改EF中插入的内部处理。服务器端生成意味着EF将跳过插入中的列,但在保存后从服务器读回值。客户端生成意味着EF将在insert语句中发送列。此外,3的值不够复杂,无法区分有用性。如果要生成只有服务器可以确定的值,例如CreationTime或某些服务器功能超过其他列或行,则无法编写客户端等效项。

最后,如果您有两个选项,那么您可以根据自己的需要配置数据库。您可以选择任何一种,在使用EF Core时不会产生巨大的影响。