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'.

我想我已经很接近了,但是好像做不好。

EF映射表错误“;无效的列名xxx_id”

第一个错误发生是因为您在相同的实体之间创建了两个关系,而代码优先约定可以识别双向关系,但当两个实体之间存在多个双向关系时就不能识别了。有额外的外键(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"));