如何通过设置数据库代码优先在数据库列中允许为空

问题描述 投票:0回答:1

我在 ASP.NET Web API 项目中创建了一个数据库,但插入数据会出现问题,因为默认情况下所有列都是

ColName (type, not null)
。我有
StartDate
EndDate
。第一次插入时,我希望
EndDate
为空。我没有找到任何允许为空的数据属性。

以及在我的

ApplicationDBContextModelSnaphot
中手动将数据更改为“具有默认值NULL”也不会执行任何操作。如何选择性地允许列为空?

ConstractionSite.cs

public class ConstractionSite 
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [MaxLength(50)]
    [Required]
    public string Name { get; set; } = string.Empty;
    public virtual ConstractionStatus Status { get; set; } 

    [ForeignKey("Status")]
    public int StatusId { get; set; }

    public DateOnly StartDate { get; set; }
    public DateOnly EndDate { get; set; } 
} 

ApplicationDbContextModelSnapshot.cs

  modelBuilder.Entity("WervenProj.Models.ConstractionSite", b =>
  {
      b.Property<int>("Id")
          .ValueGeneratedOnAdd()
          .HasColumnType("int");

      SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));

      b.Property<DateOnly>("EndDate")
          .HasColumnType("date").HasDefaultValue(null);

      b.Property<string>("Name")
          .IsRequired()
          .HasMaxLength(50)
          .HasColumnType("nvarchar(50)");

      b.Property<DateOnly>("StartDate")
          .HasColumnType("date");

      b.Property<int>("StatusId")
          .HasColumnType("int");

      b.HasKey("Id");

      b.HasIndex("StatusId");

      b.ToTable("ConstractionSites", (string)null);
  });

我还手动将迁移文件更新到属性

EndDate nullable: true
,然后运行了
update-database
。没有任何效果。

Migration.cs

migrationBuilder.CreateTable(
    name: "ConstractionSites",
    columns: table => new
    {
        Id = table.Column<int>(type: "int", nullable: false)
                  .Annotation("SqlServer:Identity", "1, 1"),
        Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
        StatusId = table.Column<int>(type: "int", nullable:  false),
        StartDate = table.Column<DateOnly>(type: "date", nullable: false),
        EndDate = table.Column<DateOnly>(type: "date", nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_ConstractionSites", x => x.Id);
        table.ForeignKey(
          name: "FK_ConstractionSites_ConstractionStatuses_StatusId",
          column: x => x.StatusId,
          principalTable: "ConstractionStatuses",
          principalColumn: "Id",
          onDelete: ReferentialAction.Cascade);
  });

有什么建议吗?谢谢你。

另一个问题:

ConstractionSiteModel
有一个与
Status
模型相关的外键。当我通过 swagger 添加 API“创建新站点”并手动添加
StatusId
字段的 ID 时,它会在
Status
表中生成新实例以及空列,但会新建一个
ID
键并更改
StatusId
ConstractionSites
中生成新的。为什么?还有其他方法来创建外键关系吗?

.net database foreign-keys database-migration nullable
1个回答
0
投票

已修复。这非常简单 - 只需添加 ?型号类型:

public DateOnly? EndDate { get; set; } 

还修复了外键问题。删除了类模型中的“外键”属性并添加到 ApplicationDFBContext

modelBuilder.Entity<ConstractionSite>(
entity =>
{
entity.HasOne(s => s.Status)
  .WithMany(x => x.ConstractionSites)
  .HasForeignKey("StatusId")
  .OnDelete(DeleteBehavior.Cascade);
});
© www.soinside.com 2019 - 2024. All rights reserved.