when I was working on the e-tickets project, I was trying to use "add migration Initial", but I’m encountering this error (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.) However, since all the properties such as CinemaId seemed the same based on the tutorial I watched, I’m not sure how to resolve it. Here are my codes:
namespace eTicekts.Data
{
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext>options):base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Actor_Movie>().HasKey(am => new
{
am.ActorId,
am.MovieId
});
modelBuilder.Entity<Actor_Movie>().HasOne(m=>m.movie).WithMany(am=>am.actor_Movies).HasForeignKey(am=>am.MovieId);
modelBuilder.Entity<Actor_Movie>().HasOne(m => m.actor).WithMany(am => am.actor_Movies).HasForeignKey(am => am.ActorId);
base.OnModelCreating(modelBuilder);
}
public DbSet<Actor> Actors { get; set; }
public DbSet<Movie> Movies { get; set; }
public DbSet<Actor_Movie> Actor_Movies { get; set; }
public DbSet<Cinema> Cinmeas { get; set; }
public DbSet<Producer> producers{ get; set; }
}
}
namespace eTicekts.Models
{
public class Actor_Movie
{
public int MovieId { get; set; }
public Movie movie { get; set; }
public int ActorId { get; set; }
public Actor actor { get; set; }
}
}
namespace eTicekts.Models
{
public class Actor
{
[Key]
public int Id { get; set; }
public string ProfilePictureURL { get; set; }
public string FullName { get; set; }
public string Bio { get; set; }
//relationships
public List<Actor_Movie> actor_Movies { get; set; }
}
}
namespace eTicekts.Models
{
public class Cinema
{
[Key]
public string Logo { get; set; }
public string Name { get; }
public string Description { get; }
//relationships
public List<Movie> Movies { get; set; }
}
}
{
public class ErrorViewModel
{
public string? RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
}
}
namespace eTicekts.Models
{
public class Movie
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int Price { get; set; }
public int ImageURL { get; set; }
public DateTime StartDate { get; set;}
public DateTime EndDate { get; set;}
public MovieCategory MovieCategory { get; set; }
//relationships
public List<Actor_Movie> actor_Movies { get; set; }
//cinema
public int CinemaId { get; set; }
[ForeignKey("CinemaId")]
public Cinema Cinema { get; set; }
//Producer
public int ProducerId { get; set; }
[ForeignKey("ProducerId")]
public Producer Producer { get; set; }
}
}
namespace eTicekts.Models
{
public class Producer
{
[Key]
public int Id { get; set; }
public string ProfilePictureURL { get; set; }
public string FullName { get; set; }
public string Bio { get; set; }
//relationships
public List<Movie> Movies { get; set; }
}
}
I couldn’t resolve the error "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." and I’m reaching out for help to solve it.
2
Answers
as you can see from the error Cinema table’s Key is "string Logo { get; set; }"
which is string , and you Referring from movies table "int CinemaId { get; set;}"
which is int , so you can Add column cinemaid to cinema Table and make it Key , or you can change cinemaid’s datatype in Movies as string.
You are missing the
Id
in Cinema, the Cinema class should be like this.