C# 实体框架核心多对多无法确定关系

C# 实体框架核心多对多无法确定关系,c#,orm,entity-framework-core,many-to-many,C#,Orm,Entity Framework Core,Many To Many,我有点困在一个很简单的问题上 我按照配置了多对多关系,但它不起作用 当我运行命令添加迁移时,我得到了这个错误 无法确定“ICollection”类型的导航属性“Command.Platforms”表示的关系。任何一个 手动配置关系,或使用忽略此属性 “[NotMapped]”属性,或使用中的“EntityTypeBuilder.Ignore” “OnModelCreating”。 您知道如何配置多对多关系而不必显式指定联接表吗 谢谢你的回答 这些是我想用EntityFramework核心配置的类

我有点困在一个很简单的问题上

我按照配置了多对多关系,但它不起作用

当我运行命令添加迁移时,我得到了这个错误

无法确定“ICollection”类型的导航属性“Command.Platforms”表示的关系。任何一个 手动配置关系,或使用忽略此属性 “[NotMapped]”属性,或使用中的“EntityTypeBuilder.Ignore” “OnModelCreating”。

您知道如何配置多对多关系而不必显式指定联接表吗

谢谢你的回答

这些是我想用EntityFramework核心配置的类。 我想要执行多对多关系的类是Command和Platform。 不要考虑参数

命令类:

    public class Command
    {
        [Key]
        [JsonIgnore]
        public int CommandId { get; set; }

        [Required]
        [MaxLength(30)]
        public string Name { get; set; }

        [Required]
        [MaxLength(250)]
        public string Description { get; set; }

        [MaxLength(250)]
        public string Example { get; set; }

        public ICollection<Platform> Platforms { get; set; }

        public List<Parameter> Parameters { get; set; }
    }
公共类命令
{
[关键]
[JsonIgnore]
public int CommandId{get;set;}
[必需]
[MaxLength(30)]
公共字符串名称{get;set;}
[必需]
[最大长度(250)]
公共字符串说明{get;set;}
[最大长度(250)]
公共字符串示例{get;set;}
公共ICollection平台{get;set;}
公共列表参数{get;set;}
}
平台等级:

    public class Platform
    {
        [Key]
        [JsonIgnore]
        public int PlatformId { get; set; }

        [MaxLength(50)]
        public string Name { get; set; }

        public ICollection<Command> Commands { get; set; }
    }
    public class CommandsDbContext : DbContext
    {
        public CommandsDbContext(DbContextOptions<CommandsDbContext> options) : base(options)
        {
        }

        public DbSet<Command> Commands { get; set; }
        public DbSet<Parameter> CommandParameters { get; set; }
        public DbSet<Platform> Platforms { get; set; }
    }
公共类平台
{
[关键]
[JsonIgnore]
公共int PlatformId{get;set;}
[MaxLength(50)]
公共字符串名称{get;set;}
公共ICollection命令{get;set;}
}
我的DbContext课程:

    public class Platform
    {
        [Key]
        [JsonIgnore]
        public int PlatformId { get; set; }

        [MaxLength(50)]
        public string Name { get; set; }

        public ICollection<Command> Commands { get; set; }
    }
    public class CommandsDbContext : DbContext
    {
        public CommandsDbContext(DbContextOptions<CommandsDbContext> options) : base(options)
        {
        }

        public DbSet<Command> Commands { get; set; }
        public DbSet<Parameter> CommandParameters { get; set; }
        public DbSet<Platform> Platforms { get; set; }
    }
public类命令dbc上下文:DbContext
{
公共命令DBContext(DbContextOptions选项):基本(选项)
{
}
公共DbSet命令{get;set;}
公共DbSet命令参数{get;set;}
公共数据库集平台{get;set;}
}
编辑: 好的,我刚刚发现它只在EF core 5中可用。

您必须将属性CommandId作为命令类的外键添加到类平台

您必须将属性CommandId作为命令类的外键添加到类平台

您可以选择。如前所述,对于显式,但是,我认为这会起作用。顺便说一句,您可以通过使ICollections
虚拟化来启用延迟加载。它不会解决你的问题,但可能会更有效。你好,Stefan,我知道问题可以解决,但我只是想知道是否有一种方法可以直接访问另一张桌子而不必玩联合桌子。好吧,你可以选择。如前所述,对于显式,但是,我认为这会起作用。顺便说一句,您可以通过使ICollections
虚拟化来启用延迟加载。它不会解决您的问题,但可能会更有效。您好Stefan,我知道问题可以解决,但我只是想知道是否有一种方法可以直接访问另一个表而不必使用联合表。是的,因为您必须在此之后添加一些代码数据库上下文。类似于此entity.HasOne的内容(d=>d.Command).WithMany(p=>p.CommandPermissions).HasForeignKey(d=>d.CommanId)最简单的方法是首先创建一个DB。在此之后,使用工具生成代码firs EF。按照建议添加属性将在imo中创建一个一对二的关系。是的,因为在此之后必须添加一些代码DB上下文。类似于此实体。HasOne(d=>d.Command)。WithMany(p=>p.CommandPermissions).HasForeignKey(d=>d.CommanId)最简单的方法是首先创建一个DB。然后使用工具生成代码firs EF。按照建议添加属性将创建一个一对多关系。