列名称“Schedule_IdSchedule”无效。没有继承,DB中没有这样的列。一个一对多

时间:2016-04-02 11:26:26

标签: c# entity-framework entity-framework-6

我使用Entity Framework 6.1.3 Code First映射到现有数据库。我已经搜索了许多关于此错误的问题,但是所有错误都与继承有关,但我没有使用继承。我试图删除我的数据库并重新创建所有表,但错误没有消失。

我有一个非常简单的数据库,只有两个表 - SchedulesSeances

CREATE TABLE [dbo].[Schedules] (
    [IdSchedule]   INT          IDENTITY (1, 1) NOT NULL,
    [Cinema]       VARCHAR (50) NULL,
    [Movie]        VARCHAR (50) NULL,
    [DateSchedule] DATETIME     NULL,
    [IdSeance]     INT          NOT NULL,
    PRIMARY KEY CLUSTERED ([IdSchedule] ASC)
);

CREATE TABLE [dbo].[Seances] (
    [IdSeance]   INT      IDENTITY (1, 1) NOT NULL,
    [DateSeance] DATETIME NOT NULL,
    PRIMARY KEY CLUSTERED ([IdSeance] ASC)
);

和模型类:

public class Schedule
{
    [Key]
    public int IdSchedule { get; set; }
    public string Cinema { get; set; }
    public string Movie { get; set; }
    public DateTime DateSchedule { get; set; }
    public List<Seance> Seances { get; set; }
}

public class Seance
{
    [Key]
    public int IdSeance { get; set; }
    public DateTime DateSeance { get; set; }
}

和EFDBContext类:

public class EFDbContext : DbContext
{
    public EFDbContext()
    {
        Database.SetInitializer<EFDbContext>(null);
    }
    public DbSet<Schedule> Schedules { get; set; }
    public DbSet<Seance> Seances { get; set; }
}

但是,当我尝试执行这些代码行时:

var e1= EFDbContext.Schedules.ToList();//it works okay
var e2 = EFDbContext.Seances.ToList();// An exception occurs

在第二行发生异常:

  

“无效的列名'Schedule_IdSchedule'。”} System.Exception {System.Data.SqlClient.SqlException}

最有趣的是我没有列名Schedule_IdSchedule。 Entity Framework在哪里采用此列? 我该如何解决?

3 个答案:

答案 0 :(得分:1)

当您在“table_fkcolumn”模式中看到不需要的列时,这意味着EF卡在那里,因为它无法解释您的模型。如果你想要一个时间表到许多集合,试试这个:

public class Schedule
{
    public Schedule()
    {
        Seances = new List<Seance>();
    }

    [Key]
    public int IdSchedule { get; set; }
    public string Cinema { get; set; }
    public string Movie { get; set; }
    public DateTime DateSchedule { get; set; }
    public virtual ICollection<Seance> Seances { get; set; }
}

public class Seance
{
    [Key]
    public int IdSeance { get; set; }
    public DateTime DateSeance { get; set; }
    public int IdSchedule { get; set; }

    [ForeignKey("IdSchedule")]
    public virtual Schedule Schedule{ get; set; }
}

或者,您可以使用流畅的配置,在这种情况下,您可以删除注释并覆盖OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{            
   modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

   modelBuilder.Entity<Schedule>()
       .HasMany(u => u.Seances)
       .WithRequired()
       .HasForeignKey(h => h.IdSchedule);           
}

答案 1 :(得分:0)

我认为您将表格从计划重新命名为计划表。 尝试刷新dbcontext。 它仍然无法正常工作,从您的dbcontext架构中删除表计划并读取它。它会起作用。

答案 2 :(得分:0)

您的代码第一个模型不会镜像您的数据库架构。我可以看到Schedule类包含一个Seances列表,所以我假设这两个类之间的关系是一对多的:

Schedule 1-* Seance

而在数据库模式中,Schedules表包含未在模型中映射的字段(IdSeance),这也是必需的(NOT NULL约束)。此外,这似乎是表Seances的外键,但没有声明FOREIGN KEY约束。这种DB模式更类似于这种关系(多对一):

Schedule *-1 Seance

正好相反。

在继续之前,请确定您的实体之间的正确关系,并记住准确映射您在DB中存在的类中所需的每个字段。还要记住,如果这些字段不遵循导航属性的EF约定,则将这些字段映射为外键。您可以使用attributesfluent API

执行此操作