EF Core 模型类:对所有属性(甚至值类型属性)使用 C# 11 `required` 修饰符?

eik*_*kuh 9 .net c# entity-framework-core c#-11.0

当在 Entity Framework Core 模型类中使用 nullable-enable 功能时,编译器将发出大量 CS8618 警告,如下所示:

warning CS8618: Non-nullable property 'Title' must contain a non-null value when exiting constructor. Consider declaring the property as nullable.
Run Code Online (Sandbox Code Playgroud)

从 C# 11 开始,required可以使用新的修饰符(不需要其他解决方法)来消除警告:

warning CS8618: Non-nullable property 'Title' must contain a non-null value when exiting constructor. Consider declaring the property as nullable.
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是:

所有属性都应该获得新的required修饰符吗,甚至是值类型?

上面的例子中,应该Price也得到required修饰符吧?因为实际上,您永远不希望价格默认为 0,但您总是希望明确指定它。

应该是:

class Book
{
    public int BookId { get; set; }

    public required string Title { get; set; } // <-- new required modifier
    public decimal Price { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如果是,那么数据库 ID(此处BookId)不应该是正确的required,因为在某些情况下它仅由数据库生成?

Emr*_*ner 1

要指定实体属性的可空性状态,您可以使用 EF 在创建迁移时考虑的“IsRequired”方法。

这是一个实体类示例:

public class Album
{
    public string AlbumId { get; set; }
    public string AlbumName { get; set; }

    // Navigational Properties
    public string ArtistId { get; set; }
    public Artist Artist { get; set; }
    public string GenreId { get; set; }
    public Genre Genre { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是该实体对应的配置类。我喜欢将这两个类保留在同一个 .cs 文件中,以获得更好的可读性。

class AlbumConfiguration : IEntityTypeConfiguration<Album>
{
    public void Configure(EntityTypeBuilder<Album> builder)
    {
        builder.HasKey(a => a.AlbumId);
        builder.Property(a => a.AlbumId)
            .HasDefaultValueSql("gen_random_uuid()")
            .HasMaxLength(36);

        builder.Property(a => a.AlbumName).HasMaxLength(30);

        builder.Property(a => a.ArtistId).HasMaxLength(36).IsRequired(false);
        builder.Property(a => a.GenreId).HasMaxLength(36).IsRequired(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您希望某个字段为必填字段,则可以将“IsRequired”设置为 true,反之亦然。

在数据库上下文类中的 OnModelCreating 方法中,您应该调用“ApplyConfiguration”方法,否则迁移将不会考虑配置类。

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions options) : base(options) { }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.ApplyConfiguration( new ArtistConfiguration() );
        builder.ApplyConfiguration( new GenreConfiguration() );
        builder.ApplyConfiguration( new AlbumConfiguration() );
    }

    public DbSet<Artist> Artist { get; set; }
    public DbSet<Genre> Genre { get; set; }
    public DbSet<Album> Album { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这就是您需要做的全部,迁移将根据您的配置为您生成适当的查询。我假设您知道如何处理迁移,但如果您也希望我详细说明这一点,请告诉我。