c# - Entity Framework 核心 : how to map multiple objects of the same type

标签 c# .net-core entity-framework-core

我有两个类,一个用于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/

相关文章:

java - 单元测试 : Is it bad practice to call public methods (for setup) while testing another method?

c# - 将实体添加到上下文时将 GUID 保留为空

.net-core - 如何创建具有嵌套依赖项的 Nuget 包

c# - .NET Core 中的短期运行后台任务

c# - 为什么 C# 认为 EF Include() 返回可为 null 的对象?

c# - C# Windows 应用程序的图库控件

c# - SignalR 未触发 OnDisconnected

c# - .Net Core 1.1 上的 OData v4 缺失/$元数据

.net-core - 将参数传递给EF Core的IDesignTimeDbContextFactory

MongoDB 和 Entity Framework 核心 2.0