【发布时间】:2019-05-28 18:23:06
【问题描述】:
我有一个带有 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; }
这些似乎都不起作用。 (这是实体框架 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; }
}
【问题讨论】:
-
您有 2 个定义了 [Key] 属性的属性。这似乎不对。
-
@Thinkhoop 我过去曾使用 [Key] 的 2 个属性,最近在 EF 6.1.3 中,它似乎在 6.2 中不起作用,并且一定有一些我遗漏的东西变了。
-
使用 [Key, Column(Order = 0)] 和 [Key, Column(Order = 1)] 代替。
-
@DevilSuichiro 仍然出现同样的错误
-
可以通过fluent api创建密钥吗?
标签: c# asp.net-mvc entity-framework