Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EFCore,多对多,DB优先,导航属性不工作_C#_Entity Framework_Entity Framework Core - Fatal编程技术网

C# EFCore,多对多,DB优先,导航属性不工作

C# EFCore,多对多,DB优先,导航属性不工作,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我正在尝试映射到现有数据库。当我使用下面的代码并提取给定实体的结果列表时,我得到了预期的结果 但是,当我尝试将.Include(x=>x.Book)添加到针对UserBook表的简单列表查询时,我的结果集返回空 [Table("User")] public class User { [Key] public Guid UserId { get; set; } public string UserName{ get; set; } // Reference

我正在尝试映射到现有数据库。当我使用下面的代码并提取给定实体的结果列表时,我得到了预期的结果

但是,当我尝试将
.Include(x=>x.Book)
添加到针对
UserBook
表的简单列表查询时,我的结果集返回空

[Table("User")]
public class User
{
    [Key]
    public Guid UserId { get; set; }
    public string UserName{ get; set; }

    // Reference
    public ICollection<UserBook> UserBooks { get; set; }
}

[Table("Book")]
public class Book
{
    [Key]
    public Guid BookId { get; set; }
    public string BookName{ get; set; }

    // Reference
    public ICollection<UserBook> UserBooks { get; set; }
}

[Table("UserBook")]
public class UserBook
{
    public Guid UserId { get; set; }
    public Guid BookId { get; set; }
    public int PermissionMask { get; set; }
    public bool Deleted { get; set; }

    // Ref
    public User User { get; set; }
    public Book Book { get; set; }
}

我认为EF会抱怨UserBook实体并没有定义键,不确定它是如何工作的。但是为了使include起作用,我相信您需要在复合键上明确显示。尝试将以下内容添加到
DbContext
类中:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<UserBook>(e => e.HasKey(c => new { c.UserId, c.BookId }));
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
实体(e=>e.HasKey(c=>new{c.UserId,c.BookId}));
}

您的映射指示一个不可为空的外键(因此EF将在查询中生成一个内部联接)。是否尝试将外键上的数据类型从Guid更改为Guid?然后再试一次。

我的UserBook表使用了UserId的主键
,我想知道如果这是一个多对多的关系,这是如何工作的。我正在离开一个提供给我的图表;仔细检查SSMS,我发现它使用的是复合密钥。应该先查一下来源,这是我的错。更新的问题反映了这一点,但最初的问题仍然存在。您能告诉我们失败的查询吗?添加的示例:+1:下一步是调查失败语句的执行SQL。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<UserBook>(e => e.HasKey(c => new { c.UserId, c.BookId }));
}