【问题标题】:EFCore, many-to-many, DB First, navigation properties not workingEFCore,多对多,DB First,导航属性不起作用
【发布时间】:2017-07-05 02:31:46
【问题描述】:

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

但是,当我尝试将 .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; }
}

我正在按照此处列出的说明进行操作:http://www.learnentityframeworkcore.com/configuration/many-to-many-relationship-configuration

为了更好地说明问题,以下是我正在使用的查询:

// Returns 1,000+ rows.
_context.UserBooks.ToList();

// Returns 1 row
_context.UserBooks
    .Where(x => x.UserId == "SomeGuid")
    .ToList();

// Returns 0 rows
_context.UserBooks
    .Include(x => x.Book)
    .Where(x => x.UserId == "SomeGuid")
    .ToList();

// Returns 0 rows
_context.UserBooks.Include(x => x.Book).ToList();

【问题讨论】:

  • my UserBook table uses a Primary Key of UserId,我想知道如果它是多对多的关系是如何工作的
  • 我正在偏离提供给我的图表;仔细检查 SSMS,我发现它正在使用复合键。应该先检查来源,那是我的错。更新了问题以反映这一点,但最初的问题仍然存在。
  • 你能告诉我们失败的查询吗?
  • 添加示例:+1:
  • 下一步是调查失败语句的执行SQL。

标签: c# entity-framework entity-framework-core


【解决方案1】:

我认为 EF 会抱怨 UserBook 实体没有定义键,不确定你是如何让它工作的。但是要使包含工作,我相信您需要明确说明复合键。尝试将以下内容添加到您的 DbContext 类中:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<UserBook>(e => e.HasKey(c => new { c.UserId, c.BookId }));
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 2019-05-16
      • 1970-01-01
      相关资源
      最近更新 更多