C# 具有EF、FluentAPI和标识的多对多

C# 具有EF、FluentAPI和标识的多对多,c#,.net,entity-framework,asp.net-core,C#,.net,Entity Framework,Asp.net Core,我想使用EF 6将多对多关系添加到我的数据库中 我想在AppUser和课程之间添加多对多。以下是我的模型: 应用程序用户 使用Microsoft.AspNetCore.Identity; 使用制度; 使用System.Collections.Generic; 命名空间WebApplication2.Models { 公共类AppUser:IdentityUser { 公共字符串LastName{get;set;} 公共字符串FirstMidName{get;set;} 公共日期时间注册日期{ge

我想使用EF 6将多对多关系添加到我的数据库中

我想在
AppUser
课程之间添加多对多。以下是我的模型:

应用程序用户
使用Microsoft.AspNetCore.Identity;
使用制度;
使用System.Collections.Generic;
命名空间WebApplication2.Models
{
公共类AppUser:IdentityUser
{
公共字符串LastName{get;set;}
公共字符串FirstMidName{get;set;}
公共日期时间注册日期{get;set;}
公共图书馆

它两次创建我的
AppUserId
AppUserId
AppuserId1
):前者为
int
,后者为
uniqueidentifier

我只需要将其作为唯一标识符使用一次。当我现在尝试添加新的
AppUserCourse
时,我会收到错误消息:

操作数类型冲突:uniqueidentifier与int不兼容


在AppUserCourse上删除实体,如下所示,重新创建迁移

 public class AppUserCourse
 {
    public Guid AppUserId { get; set; }
    public int CourseId { get; set; }
 }
这将创建多对多链接

下面是我设置的一个示例

 public class Player
 {
    public int Id { get; set; }
    public string Firstname { get; set; }
    public string Surname { get; set; }
    public List<PlayerGroup> PlayerGroups { get; set; }
 }

 public class PlayerGroup
 {
    public int PlayerId { get; set; }
    public int GroupId { get; set; }
 }

 public class Group
 {
    public int Id { get; set; }
    public string Name { get; set; }  
    public List<PlayerGroup> PlayerGroups { get; set; }
 }

 protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<PlayerGroup>().HasKey(x => new {x.GroupId, x.PlayerId});
    }
公共类播放器
{
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串姓氏{get;set;}
公共列表播放组{get;set;}
}
公共类播放组
{
public int PlayerId{get;set;}
public int GroupId{get;set;}
}
公共课组
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表播放组{get;set;}
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity().HasKey(x=>new{x.GroupId,x.PlayerId});
}
创建以下内容


很遗憾,这不起作用。我无法进行迁移,因为我收到错误“AppUserCourse不包含AppUser的定义”和“AppUserCourse不包含Course的定义”,这不会改变结果。导航道具不是问题的原因,问题是如何生成复合密钥(即不重复使用FK列,而是复制列).你测试并确认这会解决它吗?我有一个例子,我正在做我在上面的评论中写的事情,不知道为什么它会被标记下来!当它工作时。我使用一个列表,而不是IList作为链接,尽管我的例子使用的是int而不是guids。这是一个有趣的问题。我已经查找了关于t的任何怪癖他使用流畅的api(因为我知道非核心EF中的属性方法是有效的),但是(这只是我发现的众多方法中的一个例子).据我所知,你的代码与他们的代码相同。我目前无法对你的代码与我链接中的代码之间的任何差异进行鸟枪式调试,但我怀疑两者之间存在一些微妙的差异。嗯,我认为它不起作用,因为EF会自动将AppUserCourses的AppUserId生成为int。奇怪的是,它还创建了一个具有正确Guid类型的AppUserId(AppUserId1)(另请参见屏幕截图)。但我不知道如何防止这种情况发生。作为调试技巧,也许可以尝试在模型生成器中显式定义一对多关系。您的类似乎遵循约定,因此不需要它,但在过去我了解到,当多个配置发生冲突时,EF的约定解析器有时会出错。显式定义一对一排除了这种可能性,并可帮助EF决定如何生成表。