我是这个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});
}
我已经使用Fluent API从MSSql获取数据。
答案 0 :(得分:4)
问题是此处的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)
。