实体框架正在组合我的表名称和 Id 名称

Sky*_*ell 4 entity-framework entity-framework-core asp.net-core-3.1

这是一个奇怪的问题。我的 Entity Framework Core 项目将表和 Id 合并到一列中,如下所示:MonsterListMonsterId

这是错误:

Microsoft.Data.SqlClient.SqlException (0x80131904): Invalid column name 'MonsterListMonsterId'
Run Code Online (Sandbox Code Playgroud)

这是生成错误的控制器:

var treasuresByMonster = await _context.MonsterTreasures.Where(q => q.MonsterId == id).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

显然该列名为 MonsterId。不是 MonsterListMonsterId。

这是 MonsterList 类:

public class MonsterList
{
    public MonsterList()
    {
        MonsterTreasures = new HashSet<MonsterTreasures>();
    }
    public Guid MonsterId { get; set; }
    public string MonsterText { get; set; }

    public virtual ICollection<MonsterTreasures> MonsterTreasures { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是 MonsterTreasure 类:

public partial class MonsterTreasures
{
    public Guid TreasureId { get; set; }
    public Guid? MonsterId { get; set; }
    public string TreasureText { get; set; }
    public MonsterList MonsterList { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

和上下文类:

modelBuilder.Entity<MonsterTreasures>(entity =>
{
    entity.HasKey(e => e.TreasureId);
    
    entity.HasOne(e => e.MonsterList)
        .WithMany(m => m.MonsterTreasures);
        
    entity.ToTable("MonsterTreasures");

    entity.Property(e => e.TreasureId)
        .HasColumnName("TreasureId");

    entity.Property(e => e.MonsterId)
        .HasColumnName("MonsterId");

    entity.Property(e => e.TreasureText)
        .HasColumnName("TreasureText");

});
Run Code Online (Sandbox Code Playgroud)

对此的正确解决方法是什么?

谢谢!

Iva*_*oev 6

问题就在这里

public Guid? MonsterId { get; set; }
public MonsterList MonsterList { get; set; }
Run Code Online (Sandbox Code Playgroud)

名称“MonsterId”与任何 EF Core常规 FK 属性名称都不匹配:

  • <navigation property name><principal key property name>
  • <navigation property name>Id
  • <principal entity name><principal key property name>
  • <principal entity name>Id

因此,EF Core 不将其视为 FK 属性,并假定影子属性/列具有异常消息中的默认名称。

为了解决这个问题,您必须通过[ForeignKey]指定导航属性名称的 FK 属性上的数据注释来显式映射它:

[ForeignKey(nameof(MonsterList)]
public Guid? MonsterId { get; set; }
public MonsterList MonsterList { get; set; }
Run Code Online (Sandbox Code Playgroud)

或者在导航属性上指定 FK 属性的名称:

public Guid? MonsterId { get; set; }
[ForeignKey(nameof(MonsterId)]
public MonsterList MonsterList { get; set; }
Run Code Online (Sandbox Code Playgroud)

或者使用HasForeignKeyFluent API:

entity.HasOne(e => e.MonsterList)
    .WithMany(m => m.MonsterTreasures)
    .HasForeignKey(e => e.MonsterId); // <--
Run Code Online (Sandbox Code Playgroud)