以字符串为主键的实体,将自动给出一个影子键



在我从。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上的阴影键不再被创建。

感谢伊万·斯托夫给我指出了正确的方向。

相关内容

  • 没有找到相关文章

最新更新