entity-framework-core - EF Core Fluent API HasData 在后续迁移中添加删除数据
问题描述
我HasData
用来播种数据,它正在创建插入数据迁移脚本,但在随后的迁移中,它正在添加删除迁移而没有任何进一步的更改。
实体
国家
public class Country : BaseEntity
{
public string CountryName { get; set; }
}
县
public class County : BaseEntity
{
public string CountyName { get;set; }
public int CountryId { get;set; }
public Country Country { get; set; }
}
基础实体
public class BaseEntity
{
public int Id { get; set; }
public Guid ApplicationUserId { get; set; }
}
配置
public class CountyConfiguration : BaseEntityConfiguration<County>
{
private const string TABLE_NAME = "Counties";
public CountyConfiguration() : base(TABLE_NAME)
{
}
public override void Configure(EntityTypeBuilder<County> entity)
{
base.Configure(entity);
entity.Property(c => c.CountyName).IsRequired().HasMaxLength(100);
entity.HasIndex(c => c.CountryId).IsUnique(false);
entity.HasIndex(c => new {c.CountyName, c.CountryId }).IsUnique();
entity.HasOne(c => c.Country).WithOne().OnDelete(DeleteBehavior.Cascade);
entity.Ignore(c => c.ApplicationUserId);
entity.HasData(
new County { Id = 1, CountryId = 1, CountyName = "Antrim"},
new County { Id = 2, CountryId = 1, CountyName = "Carlow"},
new County { Id = 3, CountryId = 1, CountyName = "Cavan"},
new County { Id = 4, CountryId = 1, CountyName = "Clare"},
new County { Id = 5, CountryId = 1, CountyName = "Cork"},
new County { Id = 6, CountryId = 1, CountyName = "Derry (Londonderry)"},
new County { Id = 7, CountryId = 1, CountyName = "Donegal"},
new County { Id = 8, CountryId = 1, CountyName = "Dublin"},
new County { Id = 9, CountryId = 1, CountyName = "Galway"},
new County { Id = 10, CountryId = 1, CountyName = "Kerry"},
new County { Id = 11, CountryId = 1, CountyName = "Kildare"},
new County { Id = 12, CountryId = 1, CountyName = "Kilkenny"},
new County { Id = 13, CountryId = 1, CountyName = "Laois (Queens)"},
new County { Id = 14, CountryId = 1, CountyName = "Leitrim"},
new County { Id = 15, CountryId = 1, CountyName = "Limerick"},
new County { Id = 16, CountryId = 1, CountyName = "Longford"},
new County { Id = 17, CountryId = 1, CountyName = "Louth"},
new County { Id = 18, CountryId = 1, CountyName = "Mayo"},
new County { Id = 19, CountryId = 1, CountyName = "Meath"},
new County { Id = 20, CountryId = 1, CountyName = "Monaghan"},
new County { Id = 21, CountryId = 1, CountyName = "Offaly (Kings)"},
new County { Id = 22, CountryId = 1, CountyName = "Roscommon"},
new County { Id = 23, CountryId = 1, CountyName = "Sligo"},
new County { Id = 24, CountryId = 1, CountyName = "Tipperary"},
new County { Id = 25, CountryId = 1, CountyName = "Waterford"},
new County { Id = 26, CountryId = 1, CountyName = "Westmeath"},
new County { Id = 27, CountryId = 1, CountyName = "Wexford"},
new County { Id = 28, CountryId = 1, CountyName = "Wicklow"}
);
}
}
生成的迁移1:
public partial class County : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Counties",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
CountyName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
CountryId = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("Pk_Counties_Id", x => x.Id);
table.ForeignKey(
name: "FK_Counties_Countries_CountryId",
column: x => x.CountryId,
principalTable: "Countries",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.InsertData(
table: "Counties",
columns: new[] { "Id", "CountryId", "CountyName" },
values: new object[,]
{
{ 3, 1, "Cavan" },
{ 26, 1, "Westmeath" },
{ 25, 1, "Waterford" },
{ 24, 1, "Tipperary" },
{ 23, 1, "Sligo" },
{ 22, 1, "Roscommon" },
{ 21, 1, "Offaly (Kings)" },
{ 20, 1, "Monaghan" },
{ 19, 1, "Meath" },
{ 18, 1, "Mayo" },
{ 17, 1, "Louth" },
{ 16, 1, "Longford" },
{ 27, 1, "Wexford" },
{ 15, 1, "Limerick" },
{ 13, 1, "Laois (Queens)" },
{ 12, 1, "Kilkenny" },
{ 11, 1, "Kildare" },
{ 10, 1, "Kerry" },
{ 9, 1, "Galway" },
{ 8, 1, "Dublin" },
{ 7, 1, "Donegal" },
{ 6, 1, "Derry (Londonderry)" },
{ 5, 1, "Cork" },
{ 4, 1, "Clare" },
{ 2, 1, "Carlow" },
{ 14, 1, "Leitrim" },
{ 28, 1, "Wicklow" }
});
migrationBuilder.CreateIndex(
name: "IX_Counties_CountryId",
table: "Counties",
column: "CountryId");
migrationBuilder.CreateIndex(
name: "IX_Counties_CountyName_CountryId",
table: "Counties",
columns: new[] { "CountyName", "CountryId" },
unique: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Counties");
}
}
下一次迁移 2:(没有任何更改)
public partial class Empty : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "Counties",
keyColumn: "Id",
keyValue: 1);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "Counties",
keyColumn: "Id",
keyValue: 1);
migrationBuilder.InsertData(
table: "Counties",
columns: new[] { "Id", "CountryId", "CountyName" },
values: new object[] { 1, 1, "Antrim" });
}
}
不确定,为什么要添加migrationBuilder.DeleteData
删除脚本?
解决方案
这里
entity.HasOne(c => c.Country).WithOne().OnDelete(DeleteBehavior.Cascade);
WithOne()
你基本上是在告诉 EF必须County.CountryId
是唯一的(因为关系数据库中一对一和一对多之间的唯一区别是 FK 列的唯一约束(索引))。
但是,在此之前,您告诉 EF 相反
entity.HasIndex(c => c.CountryId).IsUnique(false);
这一系列冲突的配置以某种方式使 EF 感到困惑,并开始做一些奇怪的事情。
虽然这可能被认为是他们的错误,但最终问题出在您的代码中,因为显然您不想要一对一的关系。所以通过替换HasOne
来纠正HasMany
entity.HasOne(c => c.Country).WithMany().OnDelete(DeleteBehavior.Cascade);
或完全删除它,因为它所做的一切都与默认的 EF Core 约定相同。
执行此操作后,您还可以删除HasIndex
配置,因为它也是 EF Core FK 索引约定的默认设置。
推荐阅读
- javascript - 如何启动 react-native onTouchDown anination
- php - 如何从数组键和值中删除双引号?
- java - 使用java从嵌套的JSON对象中读取数据
- presto - 无法使用自定义密码验证器通过 https 启动 prestodb 服务器
- r - 用 dplyr 重写基本 R 函数 - 使用过滤器而不是 []
- google-maps-android-api-2 - 谷歌地图的自定义信息窗口在Android中不渲染高程阴影
- javascript - 如何获取哪个集群获取了请求。PM2 簇
- python-3.x - Python handlers.TimedRotatingFileHandler 旋转无法按预期工作
- typescript - 无法使用 Visual Studio Code 调试 TypeScript e2e 测试框架
- c# - 如何在启动时将后台工作程序与 MVVM 一起使用而不将命令绑定到按钮?