2017-08-09 94 views
1

我有兩個類,一個用於User,另一個用於Warn,上述用戶可以接收,並且我想映射它們,但我有這是一個問題。實體框架核心:如何映射同一類型的多個對象

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace web 
{ 
    public class User 
    { 
     public User() 
     { 
     } 

     public ICollection<MuteWarn> Mutes { get; set; } 
     public ICollection<Warn> Warns { get; set; } 
     public ICollection<Ban> Bans { get; set; } 
     public ICollection<Kick> Kicks { get; set; } 
     public int Id { get; set; } 
     public ulong DiscordId { get; set; } 
     public bool AntiBan { get; set; } 
     public ICollection<string> Permissions { get; set; } 
     public Level Level { get; set; } 
     public Mute CurrentMute { get; set; } 

     public string Name { get; set; } 
     public int Discrim { get; set; } 
     public string AvatarUrl { get; set; } 
     public Guild Guild { get; set; } 

     public bool HasPermission(string perm) 
     { 
      var res = Permissions.Where(x => x == perm); 
      if(res != null) return true; 
      return false; 
     } 
    } 
} 

這是User類,這裏是Warn類:

using System; 

namespace web 
{ 
    public class Warn 
    { 
     public Warn() 
     { 
       Moderator = DataHelper.GetDefaultModerator(); 
     } 

     public int Id { get; set; } 
     public string Reason { get; set; } 
     public DateTime Timestamp { get; set; } 
     public User Moderator { get; set; } 

     public User User { get; set; } 
     public Guild Guild { get; set; } 
    } 
} 

正如你可以看到有這一類User類型的兩個對象,我想訪問它們從用戶類,如下所示:

foreach(var w in User.Warns) 
{ 
    Console.WriteLine(w.Reason); 
    Console.WriteLine(w.Moderator.Name); 
} 

主持人和用戶是兩個單獨的用戶(即使他們可以是同一個人)。

主持人是發出此警告的人,而用戶是接收警告的用戶。

每個用戶可以有無限數量的警告。

出於某種原因,這不會生成,因爲它無法找到主持人和用戶之間的關係。

請幫忙,謝謝。

+0

您可以顯示實體請映射配置,你可以在閱讀的關係更多的細節? –

+0

@ H.Herzl你的意思是? https://pastebin.com/cDK4Kgxk – bin

+0

你與你的實體沒有關係 –

回答

1

EF Core有約定根據域類的結構計算元數據的部分。通常導航屬性表示聲明類型和目標類型之間存在關係。如果在目標類型的聲明類型中存在導航,則將它們視爲定義該關係的導航對。儘管在找到構成關係的導航對方面存在限制。如果存在歧義,那麼EF Core不會創建關係。在你的情況User類有一個導航Warns其具有目標類型Warn但類Warn有2個導航User類型的導航 - Moderator & User。現在EF無法確定哪些導航是單一關係的一部分。所以這需要用戶配置來定義關係,從而正確地建立模型。

假設User.Warns & Warn.User是一對一的關係,因爲警告部分包含所有警告用戶能獲得Warn.User應指向User。而Warn.Moderator是單獨的關係,無反向導航。有兩種方法來配置它。

數據註解

您可以在導航使用InverseProperty屬性告訴EF核心究竟是什麼導航逆導航。在你的情況下,這可以解決這個問題。

[InverseProperty("User")] 
public ICollection<Warn> Warns { get; set; } 

[InverseProperty("Warns")] 
public User User { get; set; } 

這樣就解決了不確定性,並有助於EF找出對這樣約定將建立關係。

流利的API

你可以用流利的API來明確配置的關係。您需要將此代碼放入您的DbContext.OnModelCreating方法中。

modelBuilder.Entity<User>().HasMany(e => e.Warns).WithOne(e => e.User); 

modelBuilder.Entity<Warn>().HasOne(e => e.Moderator).WithMany(); 

再次限定上述任何清除模糊性和模型正確地構建。

有關如何documentation

相關問題