我在 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
中生成新的。为什么?还有其他方法来创建外键关系吗?
已修复。这非常简单 - 只需添加 ?型号类型:
public DateOnly? EndDate { get; set; }
还修复了外键问题。删除了类模型中的“外键”属性并添加到 ApplicationDFBContext
modelBuilder.Entity<ConstractionSite>(
entity =>
{
entity.HasOne(s => s.Status)
.WithMany(x => x.ConstractionSites)
.HasForeignKey("StatusId")
.OnDelete(DeleteBehavior.Cascade);
});