SqlClient.SqlException: 从 Fluent 获取数据时列名 ClassNameId 无效 API
SqlClient.SqlException: Invalid column name ClassNameId While fetching data from Fluent API
我是这个 EF 的新手,我正在尝试从 Sql Db table 中获取数据,但它给了我 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; }
}
数据库上下文:
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 获取数据。
问题是这里的ForeignKey
注释无效
[ForeignKey("PID")]
[Column("PID")]
[Display(Name = "PID:")]
public int PID{ get; set; }
ForeignKey
是一个令人困惑的属性,因为它会根据应用的位置改变参数的含义。当应用于 FK 属性 时,它表示导航的名称 属性。当应用于导航 属性 时,它表示 FK 的名称 属性.
在您的情况下,它应用于 FK 属性,但指定了相同的 属性 名称,因此它被简单地忽略并且 EF 使用 FK 属性 的默认约定名称] 与 List<OtherClass> OtherClassList
关系相关联,这就是您获得不存在的列的原因。
要解决此问题,请在另一个 class 的导航 属性 上应用该属性(因为您在需要的 class 中没有导航 属性 FK):
[ForeignKey(nameof(OtherClass.PID))]
public List<OtherClass> OtherClassList{ get; set; }
或者(最好)用 fluent 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)
.
我是这个 EF 的新手,我正在尝试从 Sql Db table 中获取数据,但它给了我 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; }
}
数据库上下文:
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 获取数据。
问题是这里的ForeignKey
注释无效
[ForeignKey("PID")]
[Column("PID")]
[Display(Name = "PID:")]
public int PID{ get; set; }
ForeignKey
是一个令人困惑的属性,因为它会根据应用的位置改变参数的含义。当应用于 FK 属性 时,它表示导航的名称 属性。当应用于导航 属性 时,它表示 FK 的名称 属性.
在您的情况下,它应用于 FK 属性,但指定了相同的 属性 名称,因此它被简单地忽略并且 EF 使用 FK 属性 的默认约定名称] 与 List<OtherClass> OtherClassList
关系相关联,这就是您获得不存在的列的原因。
要解决此问题,请在另一个 class 的导航 属性 上应用该属性(因为您在需要的 class 中没有导航 属性 FK):
[ForeignKey(nameof(OtherClass.PID))]
public List<OtherClass> OtherClassList{ get; set; }
或者(最好)用 fluent 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)
.