我在将我的表映射在一起时遇到问题。我收到错误:
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'.
我想我已经接近了,但似乎无法恰到好处。任何帮助将不胜感激。
最佳答案
第一个错误发生是因为您在相同实体之间创建两个关系,Code First 约定可以识别双向关系,但当两个实体之间存在多个双向关系时则不能。存在额外外键的原因(Film_ID
) 是 Code First 无法确定 NormComparableFilm
中的两个属性中的哪一个返回 Film
链接到 ICollection<NormComparableFilm>
Film
中的属性类(class)。要解决这个 Code First 需要一些帮助。您可以使用 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
navigation属性可选,需要将对应FK的type改为nullable:
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"));
关于c# - EF映射表错误 "Invalid column name XXX_Id",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31618337/