【问题标题】:EntityFramework - There are no primary or candidate keys in the referenced tableEntityFramework - 引用的表中没有主键或候选键
【发布时间】:2018-12-25 00:04:48
【问题描述】:

我有 ApplicationForm 类来存储申请网站的用户信息。 ApplicationFormAnswer 用于在每个申请表中存储自定义字段答案。

 public class ApplicationFormAnswer
    {
        public Guid Id { get; set; }
        public string FieldId { get; set; }
        public ApplicationCustomFieldType FieldType { get; set; }
        public string Name { get; set; }
        public string Answer { get; set; }
        public virtual ApplicationForm ApplicationForm { get; set; }
        public Guid ApplicationFormId { get; set; }
    }

在 ApplicationForm 类中

public class ApplicationForm
{
    public Guid Id { get; set; }
    .....
    ....
    public virtual ICollection<ApplicationFormAnswer> ApplicationFormAnswers { get; set; }
}

当我尝试进行迁移时,它给了我这个错误:

引用表“dbo.ApplicationForms”中没有与外键“FK_dbo.ApplicationFormAnswers_dbo.ApplicationForms_ApplicationFormId”中的引用列列表匹配的主键或候选键。 无法创建约束或索引。查看以前的错误。

编辑:

当我应用 -verbose 时,我看到 sql 查询正在创建:

CREATE TABLE [dbo].[ApplicationFormAnswers] (
    [ApplicationFormId] [uniqueidentifier] NOT NULL,
    [Id] [uniqueidentifier] NOT NULL,
    [FieldId] [nvarchar](max),
    [FieldType] [int] NOT NULL,
    [Name] [nvarchar](max),
    [Answer] [nvarchar](max),
    [ApplicationFormCustomField_FieldId] [nvarchar](max),
    [ApplicationFormCustomField_Order] [int] NOT NULL,
    [ApplicationFormCustomField_Name] [nvarchar](max),
    [ApplicationFormCustomField_FieldType] [int] NOT NULL,
    [ApplicationFormCustomField_IsRequired] [bit] NOT NULL,
    [ApplicationFormCustomField_IsIncluded] [bit] NOT NULL,
    [ApplicationFormCustomField_CanBeDeleted] [bit] NOT NULL,
    [ApplicationFormCustomField_IsDeleted] [bit] NOT NULL,
    CONSTRAINT [PK_dbo.ApplicationFormAnswers] PRIMARY KEY ([ApplicationFormId])
)
CREATE INDEX [IX_Id] ON [dbo].[ApplicationFormAnswers]([Id])
ALTER TABLE [dbo].[ApplicationFormAnswers] ADD CONSTRAINT [FK_dbo.ApplicationFormAnswers_dbo.ApplicationForms_Id] FOREIGN KEY ([Id]) REFERENCES [dbo].[ApplicationForms] ([Id]) ON DELETE CASCADE

我看到它使 ApplicationFormId 作为主键,但主键应该是 Id。我尝试将 [Key] 放在 Id 上方,但仍然无效。

【问题讨论】:

  • 您需要在您的属性 ApplicationFormId 上的类中添加 [Key]
  • @PixelDev 我试过了,但报同样的错误
  • ApplicationForm.IdApplicationFormAnswer.ApplicationFormId 上添加属性[Key],如果有错误,仍然会从DbSetModelApplicationForm 发布modelbuilder

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


【解决方案1】:

我认为问题在于您将 [ApplicationFormId] 设置为唯一标识符,而它只是一个 FK。

只需使用int 输入ApplicationFormAnswers 即可获得[ApplicationFormId]

【讨论】:

    【解决方案2】:

    由于您的 Id 属性是 GUID 而不是 int,EF 不会自动将其识别为 ID。您可以使用[KeyAttribute] 或fluent API 手动配置ID:

    public class ApplicationFormAnswer
    {
         [Key]
         public Guid Id { get; set; }
         //...
    }
    
    public class ApplicationForm
    {
         [Key]
         public Guid Id { get; set; }
         //...
    }
    

    ...或...

    modelBuilder.Entity<ApplicationFormAnswer>().HasKey(e => e.Id);
    

    您还应该手动配置外键:

    public class ApplicationFormAnswer
    {
         [Key]
         public Guid Id { get; set; }
         public Guid ApplicationFormId { get; set; }
         [ForeignKey("ApplicationFormId")]         
         public virtual ApplicationForm ApplicationForm { get; set; }
         //...
    }
    

    ...或...

    modelBuilder.Entity<ApplicationFormAnswer>()
        .HasOne(e => e.ApplicationForm)
        .WithMany(e => e.ApplicationFormAnswers)
        .HasForeignKey(e => e.ApplicationFormId);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-26
      • 2022-01-07
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多