我是这个EF的新手,我正在从sql db表中获取数据,它给了我错误,例如 invalid classNameId error.
public class ClassName
{
[Key]
[Display(Name = "Id:")]
public int Id { get; set; }
[Display(Name = "Created By:")]
[Required(ErrorMessage = "Please enter created by.")]
[StringLength(5, MinimumLength = 2)]
public string CreatedBy { get; set; }
public List<OtherClass> OtherClassList{ get; set; }
}
public class OtherClass
{
[Column("Control")]
[Display(Name = "Control:")]
public String Control { get; set; }
[ForeignKey("PID")]
[Column("PID")]
[Display(Name = "PID:")]
public int PID{ get; set; }
}
dbContext:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<ClassName>()
.HasKey(p => p.Id);
modelBuilder.Entity<OtherClass>()
.HasKey(p=> new { p.Control, p.PID});
}
我使用流利的API从MSSQL获取数据。
问题是无效的ForeignKey
注释
[ForeignKey("PID")]
[Column("PID")]
[Display(Name = "PID:")]
public int PID{ get; set; }
ForeignKey
令人困惑,因为它根据应用的位置更改参数的含义。当在FK属性上应用时,它指示了导航属性的名称。当在导航属性上应用时,它指示了FK属性的名称。
在您的情况下,它应用于fk属性,但指定相同的属性名称,因此它被简单地忽略,EF使用与List<OtherClass> OtherClassList
关系相关的FK属性的默认常规名称,这就是为什么您要获得该属性非现有列。
要解决该问题,要么在其他类的导航属性上应用属性(因为您在类中没有需要FK的导航属性(:
[ForeignKey(nameof(OtherClass.PID))]
public List<OtherClass> OtherClassList{ get; set; }
或(最好是(用流利的API配置它:
modelBuilder.Entity<ClassName>()
.HasMany(e => e.OtherClassList)
.WithOne()
.HasForeignKey(e => e.PID);
如果您有参考导航属性,除了上述数据注释解决方案外,还可以使用
[ForeignKey(nameof(ClassName))]
[Column("PID")]
[Display(Name = "PID:")]
public int PID{ get; set; }
或
[ForeignKey(nameof(PID))]
public ClassName ClassName { get; set; }
或流利的API .WithOne()
必须更改为.WithOne(e => e.ClassName)
。