EntityType没有定义键-复合键,数据库优先

时间:2019-05-28 18:23:07

标签: c# asp.net-mvc entity-framework

我有一个带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; }
}

1 个答案:

答案 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的顺序是可以的,它只是用于对键中的列进行排序。