2017-05-28 61 views
3

我想映射到現有的數據庫。當我使用下面的代碼併爲給定的實體提供結果列表時,我得到了我期望的結果。EFCore,多對多,數據庫首先,導航屬性不起作用

但是,當我嘗試將.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(); 
+2

'我的UserBook表使用UserId'的主鍵,我想知道如果這是多對多的關係如何工作 –

+0

我正在脫離我提供的圖表;仔細檢查SSMS,我發現它使用的是複合鍵。應該先檢查源代碼,那是我的不好。更新的問題反映了這一點,但最初的問題仍然存在。 –

+0

你能告訴我們失敗的查詢嗎? –

回答

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 })); 
} 
0

你映射表示非空的外鍵(所以EF會生成查詢的內部連接)。嘗試更改從Guid到Guid的外鍵上的數據類型?然後再試一次。

相關問題