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

