You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core中使用数据注解实现主键兼作外键的迁移问题

解决EF Core主键兼外键未生成约束的问题

你的问题出在缺少关联的导航属性,以及[ForeignKey]注解的用法不符合EF Core的要求。EF Core需要通过导航属性识别实体间的关联关系,仅靠[ForeignKey]注解不足以触发外键约束的生成。

修正方案

给ProjectDetailsModel添加对应ProjectModel的导航属性,同时调整[ForeignKey]的参数指向该导航属性,具体代码修改如下:

public class ProjectDetailsModel
{
    // 主键兼外键,ForeignKey参数指定对应的导航属性名称
    [Key, ForeignKey(nameof(Project)), Required]
    public int ProjectId { get; set; }
    
    [Required]
    public string Context { get; set; }
    
    [Required]
    public DateTime StartDate { get; set; }
    
    [Required]
    public DateTime EndDate { get; set; }
  
    public IEnumerable<MediaModel> Media { get; set; }

    // 添加与ProjectModel的关联导航属性,EF Core靠它识别实体关系
    public ProjectModel Project { get; set; }
}

public class ProjectModel
{
    [Key, Required]
    public int Id { get; set; }

    [Required]
    public string Title { get; set; }

    [Required]
    public string Brief { get; set; }

    [ForeignKey(nameof(Media)), Required]
    public int ProjectCoverId { get; set; }

    public MediaModel Media { get; set; }

    // 可选:添加反向导航属性,明确一对一关联关系
    public ProjectDetailsModel Details { get; set; }
}

关键说明

  • 移除了冗余注解:EF Core中整数类型主键默认具备唯一、自增特性,无需额外标注[Unique]和[AutoIncrement]。
  • [ForeignKey(nameof(Project))]明确指定ProjectId是导航属性Project的外键,EF Core会据此生成外键约束,关联到ProjectModel的主键Id。
  • 添加反向导航属性Details可避免EF Core将关系误判为一对多,让关联逻辑更清晰。

修改后重新执行迁移,生成的约束代码会包含外键部分,示例如下:

constraints: table =>
{
    table.PrimaryKey("PK_ProjectDetailsModel", x => x.ProjectId);
    table.ForeignKey(
        name: "FK_ProjectDetailsModel_ProjectModel_ProjectId",
        column: x => x.ProjectId,
        principalTable: "ProjectModel",
        principalColumn: "Id",
        onDelete: ReferentialAction.Cascade);
});

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:33:21