EF Core 7 — произошла ошибка: для типа объекта «List<string>» требуется определить первичный ключ

Я получаю сообщение об ошибке, когда использую EF Core 7 для создания объектов.

Тип сущности «Список» требует определения первичного ключа. Если вы намеревались использовать тип сущности без ключа, вызовите HasNoKey в OnModelCreating. Дополнительные сведения о типах сущностей без ключа см. на странице https://go.microsoft.com/fwlink/?linkid=2141943.

Я нашел опору ошибки, это служебный объект, когда я только аннотирую служебный объект, тогда я могу запуститьAdd-Migrationуспешно. Я не знаю, почему, и я также не знаю, как исправить эту ошибку.

Кто-нибудь знает эту ошибку? Пожалуйста помоги...

      public class Service : EntityBase 
{
    public Guid? DefaultCapacityUnitId { get; set; }
    public Guid? DefaultSizeUnitId { get; set; }
    public virtual SizeUnit DefaultSizeUnit { get; set; }
    public Guid ProjectId { get; set; }
    public Project Project { get; set; }

    public Guid? ParentId { get; set; }
    public virtual Service Parent { get; set; }

    public Guid DisciplineId { get; set; }
    public virtual Discipline Discipline { get; set; }

    public virtual List<Service> SubServices { get; set; } = new List<Service>();
}

public class Equipment : EntityBase 
{
    public Guid ProjectId { get; set; }
    public Project Project { get; set; }

    public Guid? ServiceId { get; set; }
    public virtual Service Service { get; set; }

    public Guid DisciplineId { get; set; }
    public virtual Discipline Discipline { get; set; }
}

public abstract class EntityBase
{
    [Key]
    public virtual Guid Id { get; set; } = Guid.NewGuid();

    private string name;

    [Required, MaxLength(200)]
    public virtual string Name
    {
        get
        {
            return name?.Trim();
        }
        set
        {
            name = value?.Trim();
        }
    }

    private string shortName;

    [Required, MaxLength(100)]
    public virtual string ShortName
    {
        get
        {

            return shortName?.Trim();
        }
        set
        {
            shortName = value?.Trim();
        }
    }
        [NotMapped]
        public EntityBase Snapshot { get; set; }


        [NotMapped]
        public List<string> ValueChangedProperties { get; set; } = new List<string>();

}

public class Project : EntityBase 
{
}

public class Discipline : EntityBase 
{
    public Guid ProjectId { get; set; }

    public virtual Project Project { get; set; }

    public virtual List<Service> Services { get; set; } = new List<Service>();
    public Guid? ScenarioId { get; set; }

    public Guid? ParentId { get; set; }
    public virtual Discipline Parent { get; set; }
}
      public partial class TestDbContext : DbContext 
{
    public TestDbContext(DbContextOptions<TestDbContext> options)
            : base(options) 
    { }

    public TestDbContext() 
    {
    }

    public DbSet<Project> Projects { get; set; }
    public DbSet<Discipline> Disciplines { get; set; }

    public DbSet<Service> Services { get; set; }
    public DbSet<ServiceGroup> ServiceGroups { get; set; }

    public DbSet<SizeUnit> SizeUnits { get; set; }
    public DbSet<Equipment> Equipments { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    {
        var entityTypes = typeof(TestDbContext).GetProperties()
                            .Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))
                            .Select(p => p.PropertyType.GetGenericArguments()[0]).ToList();
        entityTypes.ForEach(entityType => {
            var entityName = entityType.Name;
            modelBuilder.Entity(entityType).ToTable(entityName);

        });
        modelBuilder.Entity<ServiceMapping>().HasOne(x => x.Service).WithMany().HasForeignKey(x => x.ServiceId).OnDelete(DeleteBehavior.Cascade);
        modelBuilder.Entity<ServiceMapping>().HasOne(x => x.TargetService).WithMany().HasForeignKey(x => x.TargetServiceId).OnDelete(DeleteBehavior.Cascade);

        base.OnModelCreating(modelBuilder);
    }
}
      public class ServiceGroup : EntityBase 
{
    public Guid ProjectId { get; set; }
    public virtual Project Project { get; set; }

    public Guid? ScenarioId { get; set; }
}

public class ServiceMapping : EntityBase
{
    public Guid ProjectId { get; set; }
    public virtual Project Project { get; set; }

    public Guid ServiceId { get; set; }

    public virtual Service Service { get; set; }

    public Guid TargetServiceId { get; set; }

    public virtual Service TargetService { get; set; }
}

public class SizeUnit : EntityBase 
{
    public Guid ProjectId { get; set; }
    public virtual Project Project { get; set; }
    public int UnitType { get; set; }
}

Если я комментируюProjectсервисного объекта, то все в порядке.

0 ответов

Другие вопросы по тегам