EntityFramework throw Error:该表没有定义主键

时间:2015-08-18 12:14:32

标签: c# sql-server asp.net-mvc entity-framework asp.net-web-api

我在Entity Framework中使用DatabaseFirst方法,我收到错误:

  

该表没有定义主键。

现在,当我是控制器的脚手架时,它正在给我

  

一个或多个实体有验证错误

必须因为EF错误在这里有效。

之前,当它给我主键错误时,我在表StudentAddress&中添加了列。 StudentCourse并使Primary KEY只是为了摆脱上述错误。但添加的列不会反映在我的图表(* .edmx)中,尽管在DB中反映回来。

数据库脚本是:

create table [Standard](

    StandardID int constraint pk_standard primary key,
    StandardName varchar(255),
    [Description] varchar(255)
);


create table Teacher(
    TeacherID int constraint pk_teacher primary key,
    TeacherName varchar(255),
    StandardID int constraint fk_teacher foreign key references [Standard](StandardID) ,
    TeacherType varchar(255)
);
create table Course(
    CourseID int constraint pk_course primary key,
    CourseName varchar(255),
    Location varchar(255),
    TeacherID int constraint fk_course foreign key references Teacher(TeacherID) ,
);
create table Student(
    StudentID int constraint pk_student primary key,
    StudentName varchar(255),
    StandardID int constraint fk_student foreign key references [Standard](StandardID) ,
);
create table StudentAddress(
    [Id] int constraint pk_SA primary key,
    StudentID int constraint fk_studentaddr foreign key references Student(StudentID) not null,
    Addr1 varchar(255),
    Addr2 varchar(255),
    City varchar (50),
    [State] varchar (50)
);
create table StudentCourse(
    [Index Number] int constraint pk_SC primary key,
    StudentID int constraint fk1_studentcourse foreign key references Student(StudentID) not null,
    CourseID int constraint fk2_studentcourse foreign key references Course(CourseID) not null,
);

PS:使用WebApi2和EF(用于数据)创建WebApp。

2 个答案:

答案 0 :(得分:1)

我敢打赌你没有在原始模型中定义StudentAddressStudentCourse的主键。现在,通过向其添加列,您可以显着更改模型的特征。

我认为这是你想要的:

create table StudentAddress(
    StudentID int constraint fk_studentaddr foreign key references Student(StudentID) not null,
    Addr1 varchar(255),
    Addr2 varchar(255),
    City varchar (50),
    [State] varchar (50),
    constraint pk_SA primary key (StudentID) -- primary key
);
create table StudentCourse(
    StudentID int constraint fk1_studentcourse foreign key references Student(StudentID) not null,
    CourseID int constraint fk2_studentcourse foreign key references Course(CourseID) not null,
    constraint pk_SC primary key (StudentID, CourseID) -- composite primary key
);

这会使Student-StudentAddress成为1:1关联,Student-StudentCourse成为n:m关联。因此,Student-StudentCourse可以隐藏在类模型中。

因此,您只应添加主键约束而不是

以下是添加列的后果:

通过将另一列添加为StudentAddress的主键,关联Student-StudentAddress将变为1:n关联(因为StudentAddress.StudentID现在可以重复)。

使用额外的Index Number列,Student-StudentCourse仍然是n:m关联,但它不能再隐藏在类模型中,因为只有在联结表时才可以只包含两个包含主键的外键。

我会从适合您的模型上创建一个新的edmx。使用修改后的主键刷新模型可能效果不佳。

这是修改后edmx的样子:

enter image description here

答案 1 :(得分:0)

您应该更新模型类。

在Models文件夹中,打开* .edmx文件以显示模型图,右键单击设计图面上的任意位置,然后选择从数据库更新模型。

了解更多信息: http://www.asp.net/mvc/overview/getting-started/database-first-development/changing-the-database