我有两个类,一个用于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
类型的对象,我想从 User 类中访问它们,如下所示:
foreach(var w in User.Warns)
{
Console.WriteLine(w.Reason);
Console.WriteLine(w.Moderator.Name);
}
等等
主持人和用户是两个不同的用户(即使他们可以是同一个人)。
版主是发出此警告的人,用户是收到警告的用户。
每个用户可以有无限数量的警告。
出于某种原因,这不会构建,因为它无法找到版主和用户之间的关系。
请帮忙,谢谢。
最佳答案
EF Core 有一些约定,可以根据域类的结构找出元数据的各个部分。通常导航属性表示声明类型和目标类型之间存在关系。如果在声明类型的目标类型中存在导航,则它们被视为定义关系的导航对。尽管在查找构成关系的导航对方面存在局限性。如果存在歧义,EF Core 将不会创建关系。在您的情况下,User
类有一个导航 Warns
具有目标类型 Warn
但类 Warn
有 2 个导航类型用户
- 版主
& 用户
。现在 EF 无法确定哪些导航是单一关系的一部分。因此,这需要用户配置来定义关系,从而正确构建模型。
假设 User.Warns
& Warn.User
是 1 关系的一部分,因为 Warns 包含用户收到的所有警告,所以 Warn.User
应该指向到用户
。而 Warn.Moderator
是没有反向导航的独立关系。有两种配置方法。
数据注释
您可以在导航中使用 InverseProperty
属性来告诉 EF Core 此导航的反向导航是什么。在您的情况下,这两种方法都可以解决问题。
[InverseProperty("User")]
public ICollection<Warn> Warns { get; set; }
或
[InverseProperty("Warns")]
public User User { get; set; }
这将解决歧义并帮助 EF 找出对,以便约定将创建关系。
流畅的 API
您可以使用 fluent api 显式配置关系。您需要将此代码放入 DbContext.OnModelCreating
方法中。
modelBuilder.Entity<User>().HasMany(e => e.Warns).WithOne(e => e.User);
或
modelBuilder.Entity<Warn>().HasOne(e => e.Moderator).WithMany();
再次定义上述任何一个都可以消除歧义并正确构建模型。
有关如何配置关系的更多详细信息,您可以阅读 documentation
关于c# - Entity Framework 核心 : how to map multiple objects of the same type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45601562/