c# - EF映射表错误 "Invalid column name XXX_Id"

标签 c# .net entity-framework

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

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/

相关文章:

c# - 重定向输出时 ResGen.exe 卡住

c# - 奥尔良无国籍 worker

c# - ListBox 中的 WrapPanel 具有水平和垂直滚动功能

.net - System.Runtime.InteropServices.COMException(0x80070008): Not enough storage is available to process this command

c# - StringComparison.InvariantCultureIgnoreCase 有快捷方式吗?

entity-framework - 如何在 Entity Framework 中将字段设置为DBNull

c# - 如何向我的 User 类添加附加功能

asp.net-mvc - EF CF 和现有一对一关系的问题

c# - 数据库将连接但无法插入数据

c# - 无效的基本约束 : A certificate's basic constraint extension has not been observed