我在将表格映射到一起时遇到了问题。我收到错误:
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
我认为我很接近,但似乎无法做到恰到好处。任何帮助将不胜感激。
答案 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