.net core 实体框架核心2.x默认值

.net core 实体框架核心2.x默认值,.net-core,entity-framework-core,.net Core,Entity Framework Core,在官方文档中,我可以看到在我的模型的属性上设置默认值,它仅由Fluent API(无数据注释)实现 我用同样的结果测试了两者。使用第二种方法正确吗? 什么更好 提前感谢这些完全无关。第一个是默认列值,当您在表中创建新记录并且不显式地为该列赋值时,将使用该默认列值。第二个是类属性的默认值。当您使用hasdaultvalueAPI时,您将数据库配置为在INSERT语句中未提供值时生成值。无论您在SSMS中使用EF或原始SQL还是直接写入insert语句,这都将生成该值 在CLR类型中设置默认值时,将

在官方文档中,我可以看到在我的模型的属性上设置默认值,它仅由Fluent API(无数据注释)实现

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


提前感谢

这些完全无关。第一个是默认列值,当您在表中创建新记录并且不显式地为该列赋值时,将使用该默认列值。第二个是类属性的默认值。

当您使用
hasdaultvalue
API时,您将数据库配置为在
INSERT
语句中未提供值时生成值。无论您在SSMS中使用EF或原始SQL还是直接写入insert语句,这都将生成该值

在CLR类型中设置默认值时,将不会配置数据库。所以,您实际上是在客户机上生成值,而不是服务器生成值。当您在未设置分级的情况下初始化新博客时,它的值将为
3
,除非另有设置,否则EF将保存到数据库中。此客户端生成意味着您需要在insert语句中包含
评级
列,并在插入记录时提供来自客户端的值

什么更好?

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

最后,如果两个选项都可用,则由您决定如何配置数据库。你可以选择任何一个,它与EF Core一起使用不会有太大的区别

modelBuilder.Entity<Blog>()
            .Property(b => b.Rating)
            .HasDefaultValue(3);
public int Rating { get; set; } = 3;