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
相关产品推荐
相关产品推荐

