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

ASP.NET Core执行add migration Initial时外键不兼容错误解决求助

解决EF Core迁移错误:外键与主键类型不兼容

The relationship from 'Movie.Cinema' to 'Cinema.Movies' with foreign key properties {'CinemaId' : int} cannot target the primary key {'Logo' : string} because it is not compatible. Configure a principal key or a set of foreign key properties with compatible types for this relationship

这个错误的核心是Movie实体的外键CinemaId(int类型)与Cinema实体的主键Logo(string类型)类型不匹配,EF Core无法建立合法的一对多关系,以下是两种解决方案:

方案1:修正Cinema的主键(推荐)

通常实体主键应使用独立无业务含义的标识(如自增int),而非Logo这类业务属性。修改实体类如下:

修改后的Cinema实体

public class Cinema
{
    // EF Core自动识别名为[实体名+Id]的属性为主键
    public int CinemaId { get; set; }
    public string Logo { get; set; } // 作为普通业务属性保留
    public string Name { get; set; }
    public string Description { get; set; }

    public ICollection<Movie> Movies { get; set; }
}

保持Movie实体不变(外键类型与主键一致)

public class Movie
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int CinemaId { get; set; } // int类型与Cinema的CinemaId匹配
    public Cinema Cinema { get; set; }
}

方案2:强制使用Logo作为Cinema主键(不推荐)

如果业务需求必须用Logo作为Cinema的主键,需要将Movie的外键改为string类型,与Logo类型匹配:

修改后的Cinema实体(显式标记主键)

using System.ComponentModel.DataAnnotations;

public class Cinema
{
    [Key] // 显式标记Logo为主键
    public string Logo { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public ICollection<Movie> Movies { get; set; }
}

修改后的Movie实体(外键类型匹配)

public class Movie
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string CinemaLogo { get; set; } // string类型与Cinema的Logo主键匹配
    public Cinema Cinema { get; set; }
}

可选:用Fluent API明确配置关系

如果使用Fluent API配置实体关系,需确保外键与主键类型对应:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 方案1的Fluent配置
    modelBuilder.Entity<Movie>()
        .HasOne(m => m.Cinema)
        .WithMany(c => c.Movies)
        .HasForeignKey(m => m.CinemaId);

    // 方案2的Fluent配置(注释打开即可使用)
    // modelBuilder.Entity<Movie>()
    //     .HasOne(m => m.Cinema)
    //     .WithMany(c => c.Movies)
    //     .HasForeignKey(m => m.CinemaLogo)
    //     .HasPrincipalKey(c => c.Logo);
}

完成修改后执行add migration Initial命令即可正常生成迁移。

内容的提问来源于stack exchange,提问作者Muhammet Köse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:25:16