【问题标题】:Create Foreign Key using Data Annotations使用数据注释创建外键
【发布时间】:2014-07-22 22:43:54
【问题描述】:

在下面的代码中,我需要在 ParentInfoAddProperties.ParentQuestionAnswersId 上设置一个外键常量,以便它依赖于 ParentQuestionAnswers.Id(这是一个主键)。我正在尝试使用数据注释来执行此操作,但实体框架 6 想要在我的 ParentQuestionAnswers 表中创建一个新的外键列,该列引用 ParentInfoAddProperties.Id 列而不是 ParentInfoAddProperties.ParentQuestionAnswersId 列。我不希望 Entity Framework 创建新的外键列。

如果有人能解释我应该指定哪些数据注释或(如有必要)流畅映射来实现所需的外键常量,我将不胜感激。提前致谢。

namespace Project.Domain.Entities
{  
    public class ParentQuestionAnswers
    {
        public ParentQuestionAnswers()
        {
            ParentInfoAddProperties = new ParentInfoAddProperties();
        }

        [Required]
        public int Id { get; set; }

        [Required]
        public int UserId { get; set; }

        public ParentInfoAddProperties ParentInfoAddProperties { get; set; }
    }

    public class ParentInfoAddProperties
    {
        [Required]
        public int Id { get; set; }

        [Required]
        public int ParentQuestionAnswersId { get; set; }
    }
}

【问题讨论】:

    标签: c# ef-code-first foreign-keys data-annotations entity-framework-6


    【解决方案1】:

    您可以使用以下数据注释,并使用实体而不是 int

    [Required]
    [ForeignKey("ParentQuestionAnswers")]
    public ParentQuestionAnswers ParentQuestionAnswers { get; set; }
    

    要获得只有你可以添加属性的 Id

    public int ParentQuestionAnswersId { get; set; }
    

    但您仍然需要 ParentQuestionAnswers 属性,以便 EF 了解您。

    (这些代码行应该在ParentInfoAddProperties 类下)

    【讨论】:

    • 我将 ParentQuestionsAnswers 实体属性添加到了 ParentInfoAddProperties 类,但这会导致错误“在类型 'CPN.Domain.Entities.ParentInfoAddProperties' 上的属性 'ParentQuestionsAnswers' 上的 ForeignKeyAttribute 无效。外键在依赖类型“CPN.Domain.Entities.ParentInfoAddProperties”上找不到名称“ParentQuestionsAnswers”。名称值应该是逗号分隔的外键属性名称列表。”有什么进一步的建议吗?
    • 试试 [Required, ForeignKey("ParentQuestionAnswers")] 你没有ParentQuestionsAnswers,这应该是ParentQuestionAnswers
    • 我认为我需要完全重置 dbContext,以便从定义的实体完全重建我的数据库?
    • 此外,无意中构建了一个额外的外键约束,它将 ParentInfoAddProperties 表的 Id 映射到 ParentQuestionAnswers 表。任何建议,有人吗?提前致谢
    • 对于您的数据库,您可以删除它并再次运行您的程序或使用DropCreateDatabaseAlways(google it),直到您获得正确的实体。至于额外的外键应该只有一个,除非你添加了更多的 DataAnnotations ?请在您的问题中更新您的代码。
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2012-08-08
    • 2016-08-26
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多