2017-08-09 11 views
1

Userの2つのクラスとそのユーザーが受け取ることができるWarnの1つをマップしたいと思いますそうする問題。エンティティフレームワークコア:同じ種類の複数のオブジェクトをマップする方法

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クラスです:あなたがタイプUserの2つのオブジェクトがこのクラスである見ることができる、と私はそれらにアクセスしたいと

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

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

となど

:そのようなUserクラスから

司会者とユーザーは2人の別個のユーザーです(ただし、同じ人でも可能です)。

司会者はこの警告を発した人物であり、ユーザーは警告を受け取ったユーザーです。

各ユーザーは、無制限の警告数を持つことができます。

モデレータとユーザーの関係が見つからないため、何らかの理由でこれが構築されません。

助けてください、ありがとうございます。

+0

あなたが読むことができる関係を設定する方法の詳細については

? –

+0

@H.Herzlあなたはこれを意味しますか? https://pastebin.com/cDK4Kgxk – bin

+0

あなたのエンティティとの関係はありません –

答えて

1

EFコアには、ドメインクラスの構造に基づいてメタデータの一部を把握するための規則があります。一般に、ナビゲーションプロパティは、宣言型とターゲット型の間に関係が存在することを表します。また、宣言型のターゲット型にナビゲーションがある場合、その関係を定義するナビゲーション・ペアとみなされます。関係を構成するナビゲーションの組を見つけるという点では限界があるが、あいまいさがあると、EFコアは関係を作成しません。 Moderator & User - あなたのケースではUserクラスは、ターゲット・タイプWarnを持っていますが、クラスWarnはタイプUserの2つのナビゲーションを持っている1つのナビゲーションWarnsを持っています。現在、EFではどのナビゲーションが単一の関係の一部であるか把握できません。したがって、これは関係を定義してモデルを正しく構築するためにユーザー構成を必要とします。すべての警告のユーザーはそうWarn.UserUserを指している必要があります取得含ま警告しますので、User.Warns & Warn.Userを想定し

は1人の関係の一部です。 Warn.Moderatorは、逆のナビゲーションなしでは別個の関係です。これを設定するには2つの方法があります。あなたは、このナビゲーションのための逆ナビゲーションは何であるEFコアを伝えるために、あなたのナビゲーションにInverseProperty属性を使用することができます

データ注釈

。あなたのケースでは、どちらかが問題を解決します。

[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

関連する問題