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)
对此的正确解决方法是什么?
谢谢!
问题就在这里
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)
| 归档时间: |
|
| 查看次数: |
1910 次 |
| 最近记录: |