EF映射表错误“;无效的列名xxx_id”
本文关键字:xxx id 无效 映射 错误 EF | 更新日期: 2023-09-27 18:04:38
我有一个问题映射我的表在一起。我得到错误:
Invalid column name 'Film_Id'.
这里是我的实体:
public class Film
{
[Key]
public Int32 Id { get; set; }
public String Title { get; set; }
public virtual ICollection<NormComparableFilm> NormComparableFilms { get; set; }
}
public class NormComparableFilm
{
[Key]
public Int32 Id { get; set; }
public Int32 FilmId { get; set; }
public Int32 ComparableFilmId { get; set; }
[ForeignKey("FilmId")]
public virtual Film Film { get; set; }
[ForeignKey("ComparableFilmId")]
public virtual Film ComparableFilm { get; set; }
}
在OnModelCreating()函数中是否有我需要的自定义映射?我尝试添加以下内容,但它失败了,出现了一个稍微不同的错误:
modelBuilder.Entity<Film>()
.HasMany(f => f.NormComparableFilms)
.WithMany().Map(t => t.MapLeftKey("FilmId")
.MapRightKey("ComparableFilmId")
.ToTable("NormComparableFilms"));
上面给出了这个错误:
Invalid object name 'dbo.NormComparableFilms1'.
我想我已经很接近了,但是好像做不好。
第一个错误发生是因为您在相同的实体之间创建了两个关系,而代码优先约定可以识别双向关系,但当两个实体之间存在多个双向关系时就不能识别了。有额外的外键(Film_ID
)的原因是Code First无法确定NormComparableFilm
中的两个属性中的哪一个返回Film
链接到Film
类中的ICollection<NormComparableFilm>
属性。要解决这个代码首先需要一点帮助。您可以使用InverseProperty
数据注释来指定这些关系的正确结束,例如:
public class NormComparableFilm
{
[Key]
public int Id { get; set; }
public int FilmId { get; set; }
public int ComparableFilmId { get; set; }
[ForeignKey("FilmId")]
[InverseProperty("NormComparableFilms")]
public virtual Film Film { get; set; }
[ForeignKey("ComparableFilmId")]
public virtual Film ComparableFilm { get; set; }
}
或者删除你已经在使用的数据注释,只添加这些配置:
modelBuilder.Entity<NormComparableFilm>()
.HasRequired(ncf=>ncf.Film)
.WithMany(f=>f.NormComparableFilms)
.HasForeignKey(ncf=>ncf.FilmId);
modelBuilder.Entity<NormComparableFilm>()
.HasRequired(ncf=>ncf.ComparableFilm)
.WithMany()
.HasForeignKey(ncf=>ncf.ComparableFilmId);
如果在第二种关系中,ComparableFilm
导航属性是可选的,则需要将相应FK的类型更改为可空的:
public class NormComparableFilm
{
//...
public int? ComparableFilmId { get; set; }
}
并使用以下配置:
modelBuilder.Entity<NormComparableFilm>()
.HasOptional(ncf=>ncf.ComparableFilm)
.WithMany()
.HasForeignKey(ncf=>ncf.ComparableFilmId);
关于第二个错误,您试图将Film
表调用为NormComparableFilms
,这是EF将按照约定为NormComparableFilm
实体所表示的表提供的默认名称。
如果需要重命名其中一个表,可以使用以下配置:
modelBuilder.Entity<Film>().ToTable("Films"));