【问题标题】:EntityType has no key defined-- Composite Key, Database FirstEntityType 没有定义键——复合键,数据库优先
【发布时间】: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


【解决方案1】:

错误“EntityType '{x}' has no key defined。定义此 EntityType 的键。”表示 DBSet 指向的类不是您上面的实体定义。在 DbContext 中,使用DbSet&lt;CurriculumPersonType&gt; 右键单击​​ 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 的顺序很好,它只是用于对键中的列进行排序。

【讨论】:

  • 您的第二个链接将我引向了问题...我需要将以下代码添加到 OnModelCreating:modelBuilder.Entity().HasKey(t => new { t.CurriculumId, t .PersonTypeId });
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2016-04-02
  • 2016-03-16
相关资源
最近更新 更多