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

时间:2015-07-24 19:27:38

标签: c# .net entity-framework

我在将表格映射到一起时遇到了问题。我收到错误:

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; }

}

以下是我的实体:

modelBuilder.Entity<Film>()
    .HasMany(f => f.NormComparableFilms)
    .WithMany().Map(t => t.MapLeftKey("FilmId")
    .MapRightKey("ComparableFilmId")
    .ToTable("NormComparableFilms"));

我需要在OnModelCreating()函数中有自定义映射吗?我尝试添加以下内容,但失败时出现略有不同的错误:

Invalid object name 'dbo.NormComparableFilms1'.

上面给出了这个错误:

Stream.itearate

我认为我很接近,但似乎无法做到恰到好处。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

发生第一个错误是因为您在同一个实体之间创建了两个关系,Code First约定可以识别双向关系,但是当两个实体之间存在多个双向关系时却没有。原因是有额外的外键({{1 }})Code First无法确定Film_ID中哪两个属性返回NormComparableFilm链接到Film类中的ICollection<NormComparableFilm>属性。要解决此Code First需要一些帮助。您可以使用Film数据注释来指定这些关系的正确结尾,例如:

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); 导航属性是可选的,则需要将相应FK的类型更改为可为空:

ComparableFilm

并使用此配置:

public class NormComparableFilm
{
    //...
    public int? ComparableFilmId { get; set; }
}

关于第二个错误,您尝试将modelBuilder.Entity<NormComparableFilm>() .HasOptional(ncf=>ncf.ComparableFilm) .WithMany() .HasForeignKey(ncf=>ncf.ComparableFilmId); 表调用为Film,这是EF按惯例为NormComparableFilms实体表示的表提供的默认名称。

如果您需要重命名其中一个表,则可以使用此配置:

NormComparableFilm
相关问题