在我从。net core 3.1升级到。net 6时,我在我的实体的字符串主键中运行以下问题。
public class Country
{
public string CountryCode { get; set; }
public string Name { get; set; }
}
实体配置CountryCode
为key:
modelBuilder.Entity<Country>().HasKey(c => c.CountryCode);
modelBuilder.Entity<Country>().Property(c => c.CountryCode).ValueGeneratedNever();
国家可以与其他实体相关,如公司:
public class Company
{
public int Id { get; set; }
public string CompanyCode { get; set; }
public string Name { get; set; }
public string CountryCode { get; set; }
public Country Country { get; set; }
}
关系配置为:
modelBuilder.Entity<Company>().HasOne<Country>(c => c.Country).WithMany().HasForeignKey(c => c.CountryCode);
在。net core 3.1中,这工作得很好,然而在。net 6中,Country
实体是用一个影子键创建的:TempId1
.
migrationBuilder.CreateTable(
name: "Countries",
columns: table => new
{
CountryCode = table.Column<string>(type: "nvarchar(450)", nullable: false),
Name = table.Column<string>(type: "nvarchar(max)", nullable: true),
TempId1 = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Countries", x => x.CountryCode);
table.UniqueConstraint("AK_Countries_TempId1", x => x.TempId1);
});
从下面Ivan Stoev的评论中,我现在明白了这与c# 8.0及以上版本中的可空引用类型功能有关。我试图通过确保CountryCode不能在code中设置为null来确保EF Core的PK不会为空:
public string CountryCode { get; set; } = null!;
但这对阴影键没有影响。
问题不仅在于与Company
的关系。实体Company
也有一个Address
的复杂对象,其中也包括对Country
的引用。
modelBuilder.Entity<Company>().Ignore(v => v.Address);
然而,这个配置实际上并没有阻止它被评估。当我注释掉Company
上的Address
属性时,Country
上的阴影键不再被创建。
感谢伊万·斯托夫给我指出了正确的方向。