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,因为在某些情况下它仅由数据库生成?
要指定实体属性的可空性状态,您可以使用 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)
这就是您需要做的全部,迁移将根据您的配置为您生成适当的查询。我假设您知道如何处理迁移,但如果您也希望我详细说明这一点,请告诉我。