在官方文档中,我可以看到在我的模型的属性上设置默认值,它只能通过Fluent API(没有数据注释)。
modelBuilder.Entity<Blog>()
.Property(b => b.Rating)
.HasDefaultValue(3);
在另一方面,我在视频教程中看到作者在同一属性中设置了默认值:
public int Rating { get; set; } = 3;
我测试了两个相同的结果。使用第二种方法是正确的吗? 什么更好?
提前致谢
答案 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时不会产生巨大的影响。