我使用Entity Framework 6.1.3
Code First映射到现有数据库。我已经搜索了许多关于此错误的问题,但是所有错误都与继承有关,但我没有使用继承。我试图删除我的数据库并重新创建所有表,但错误没有消失。
我有一个非常简单的数据库,只有两个表 - Schedules
和Seances
:
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在哪里采用此列?
我该如何解决?
答案 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约定,则将这些字段映射为外键。您可以使用attributes或fluent API。
执行此操作