我有一个带3个表的ASP.NET MVC Web应用程序,PersonType,Curriculum和CurriculumPersonType将其他2个表与一个组合键绑定在一起。我试图对该表运行LINQ语句。当我运行代码时,我得到一个“ EntityType:EntitySet'CurriculumPersonType'没有定义的密钥。为此实体类型定义密钥。”错误。
我从模型开始:
public class CurriculumPersonType
{
[Key]
public long CurriculumId { get; set; }
[Key]
public long PersonTypeId { get; set; }
[ForeignKey("PersonTypeId")]
public virtual PersonType PersonType { get; set; }
[ForeignKey("CurriculumId")]
public virtual Curriculum Curriculum { get; set; }
}
,并尝试添加其他注释,例如:
[Key]
[Column("CurriculumId",Order =1)]
public long CurriculumId { get; set; }
[Key]
[Column("PersonTypeId",Order =2)]
public long PersonTypeId { get; set; }
和:
[Key]
[ForeignKey("FK_CurriculumPersonType_CurriculumId")]
public long CurriculumId { get; set; }
[Key]
[ForeignKey("FK_CurriculumPersonType_PersonTypeId")]
public long PersonTypeId { get; set; }
这些似乎都不起作用。 (这是Entity Framework 6.2.0)
我在堆栈溢出和其他站点上浏览了类似的帖子,但似乎无法解决我的问题。我想我只需要另一双眼睛。
以下是表格:
CREATE TABLE [dbo].[CurriculumPersonType]
(
[CurriculumId] BIGINT NOT NULL,
[PersonTypeId] BIGINT NOT NULL,
primary key ([CurriculumId], [PersonTypeId]),
CONSTRAINT [FK_CurriculumPersonType_PersonTypeId] FOREIGN KEY ([PersonTypeId]) REFERENCES [dbo].[PersonType] ([Id]),
CONSTRAINT [FK_CurriculumPersonType_CurriculumId] FOREIGN KEY ([CurriculumId]) REFERENCES [dbo].[Curriculum] ([Id])
)
CREATE TABLE [dbo].[PersonType]
(
[Id] BIGINT NOT NULL PRIMARY KEY IDENTITY,
[Name] VARCHAR(50) NOT NULL,
)
CREATE TABLE [dbo].[Curriculum]
(
[Id] BIGINT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
[Name] varchar(500) NULL,
)
其他2种实体模型:
public class Curriculum
{
[Key]
public long Id { get; set; }
public string Name { get; set; }
}
public class PersonType
{
[Key]
public long Id { get; set; }
public string Name { get; set; }
}
和DBContext:
public class ApplicationDBContext : DbContext
{
public ApplicationDBContext() : base("ApplicationDbContext")
{
}
public DbSet<Curriculum> Curriculums { get; set; }
public DbSet<CurriculumPersonType> CurriculumPersonTypes { get; set; }
public DbSet<PersonType> PersonTypes { get; set; }
}
我的应用程序还有其他表/模型等,但是每当我尝试打中任何一个表/模型时,我都会得到上面的错误。
只是在玩耍,我向CurriculumPersonType表和模型添加了一个PK,一切正常。当然,我不想这样做,因为那样将允许重复的值,但是它似乎挂在了没有名为“ Id”的属性的模型上。
新表/模型:
CREATE TABLE [dbo].[CurriculumPersonType]
(
[Id] BIGINT NOT NULL IDENTITY(1,1),
[CurriculumId] BIGINT NOT NULL,
[PersonTypeId] BIGINT NOT NULL,
CONSTRAINT [FK_CurriculumPersonType_PersonTypeId] FOREIGN KEY ([PersonTypeId]) REFERENCES [dbo].[PersonType] ([Id]),
CONSTRAINT [FK_CurriculumPersonType_CurriculumId] FOREIGN KEY ([CurriculumId]) REFERENCES [dbo].[Curriculum] ([Id]),
CONSTRAINT [PK_CurriculumPersonType] PRIMARY KEY ([Id])
)
public class CurriculumPersonType
{
[Key]
public long Id { get; set; }
//[Key]
//[Column(Order = 1)]
public long CurriculumId { get; set; }
//[Key]
//[Column(Order = 2)]
public long PersonTypeId { get; set; }
[ForeignKey("CurriculumId")]
public virtual Curriculum Curriculum { get; set; }
[ForeignKey("PersonTypeId")]
public virtual PersonType PersonType { get; set; }
}
答案 0 :(得分:0)
错误“ EntityType'{x}'尚未定义键。为此实体类型定义键”。指示DBSet指向的是您上面的Entity定义以外的其他类。在DbContext中,使用DbSet<CurriculumPersonType>
中的鼠标右键单击CurriculumPersonType,然后单击“转到定义”。我的直觉是,您定义了另一个名为CurriculumPersonType的类,该类正在被DbContext引用(例如,自动生成的类)。如果这些类位于不同的程序集中,请确保所有程序集均已构建并保持最新状态,尽管在更改引用的程序集后应自动对其进行重新构建。
如果您的实体具有仅使用[Key]
且没有列顺序的复合键,则异常消息为:
“无法确定类型'{x}'的组合主键顺序。使用ColumnAttribute(请参见http://go.microsoft.com/fwlink/?LinkId=386388)或HasKey方法(请参见http://go.microsoft.com/fwlink/?LinkId=386387)来指定组合主键的顺序。”
可以使用[Key, Column(Order=0)]
分配列顺序,如果属性名称匹配,则无需在属性中指定列名称。使用0,1或1,2的顺序是可以的,它只是用于对键中的列进行排序。