c# - 急切加载导航属性时,Entity Core 查询仅返回一项

标签 c# entity-framework .net-core

使用 Entity Core 创建一个简单的 restful Web API。我遇到的问题是,当使用简单的 context.Users.ToListAsync() 查询时,我收到了数据库中所有用户的列表,但是,当加载一对一关系导航属性时(context.Users.Include(u => u.Status).ToListAsync()),我总是只收到数据库中的第一项。

这是我的 Code First 模型:

public class User
{        

    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return LastName + ", " + FirstName; } }
    public string Email { get; set; }
    public string Avatar { get; set; }
    public string GUID { get; set; }
    public string InternalId { get; set; }

    // Foreign keys and navigation properties
    public virtual UserStatus Status { get; set; }
}

public class UserStatus
{
    public int Id { get; set; }
    public string Name { get; set; }

    // Foreign keys and navigation properties
    public virtual List<User> Users { get; set; }
}

每个用户都必须有一个用户状态。用户状态应该是一个可能的状态表。将有许多用户具有单一状态类型。这是我的流利映射:

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        // Users
        modelBuilder.Entity<User>()
            .HasAlternateKey(p => p.GUID);

        modelBuilder.Entity<User>()
            .HasAlternateKey(p => p.InternalId);

        modelBuilder.Entity<User>()
            .HasAlternateKey(p => p.Email);

        modelBuilder.Entity<User>()
            .Property(p => p.FirstName)
            .HasMaxLength(40)
            .IsRequired();

        modelBuilder.Entity<User>()
            .Property(p => p.LastName)
            .HasMaxLength(40)
            .IsRequired();

        modelBuilder.Entity<User>()
            .Property(p => p.Email)
            .HasMaxLength(250)
            .IsRequired();

        modelBuilder.Entity<User>()
            .HasOne(p => p.Status)
            .WithMany(s => s.Users)
            .HasForeignKey("StatusId")
            .OnDelete(Microsoft.EntityFrameworkCore.Metadata.DeleteBehavior.Restrict);

        // User Status
        modelBuilder.Entity<UserStatus>()
            .Property(s => s.Name)
            .HasMaxLength(40)
            .IsRequired();

    }

这是我正在测试的简单数据初始化:

        List<UserStatus> status = new List<UserStatus>();

        status.Add(new UserStatus { Name = "Invited" });
        status.Add(new UserStatus { Name = "Registered" });
        status.Add(new UserStatus { Name = "Verified" });
        status.Add(new UserStatus { Name = "Deactivated" });

        foreach (UserStatus s in status)
        {
            context.UserStatus.Add(s);
        }
        context.SaveChanges();

        List<User> users = new List<Users>();

        users.Add(new User {
            FirstName = "Jack",
            LastName = "Test",
            Email = "JackTest@aol.com",
            GUID = "TEST001",
            InternalId = "00001",
            Status = status[0]
        });
        users.Add(new User
        {
            FirstName = "Jane",
            LastName = "Tester",
            Email = "JaneTester@gmail.com",
            GUID = "TEST002",
            InternalId = "00002",
            Status = status[1]
        });

        foreach (User u in users)
        {
            context.Users.Add(u);
        }
        context.SaveChanges();

在我的 Web API 控件中,纯粹为了测试,我正在执行以下操作:

    [HttpGet]
    public async Task<IActionResult> Get()
    {
        var users = await context.Users
            .ToListAsync();
        return new OkObjectResult(users);
    }

这很好用。我得到了我的用户列表。但是如果我这样做:

       [HttpGet]
        public async Task<IActionResult> Get()
        {
            var users = await context.Users
                .Include(u => u.Status)
                .ToListAsync();
            return new OkObjectResult(users);
        }

我只得到数据库中的第一个条目。如果我这样做:

       [HttpGet]
        public async Task<IActionResult> Get()
        {
            var users = await context.Users
                .Include(u => u.Status)
                .LastAsync();
            return new OkObjectResult(users);
        }

我得到的不是第一个条目,而是最后一个条目,这对我来说意味着正在处理整个列表,至少在调用 ToListAsync 之前是这样。

有人可以告诉我我做错了什么吗?一对一关系是否设置不正确?我的数据初始化?我想不通这个。

最佳答案

调试帮助我找到了解决方案,谁会想到?

我从 Json 序列化程序中收到循环引用处理错误。当然,我的模型对导航属性使用循环引用。我在序列化时通过忽略这些解决了这个问题。在另一个问题上专门使用此解决方案:

https://stackoverflow.com/a/38382021/7087278

该解决方案描述了 ASP.net Core 的流程,这正是我所需要的。

关于c# - 急切加载导航属性时,Entity Core 查询仅返回一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40313808/

相关文章:

c# - 如何为 EF 中的 POCO 实体添加 C# 自动计算?

c# - 从 .NET Framework 4.52 迁移到 .NET Core 后的通用存储库问题

c# - 如何在 .net 核心 API 中通过 API key 或用户凭据处理身份验证?

c# - GCE 允许特定端口上的传入流量

javascript - 在 Visual Studio Code 上使用空格、括号或句点触发 Intellisense 自动完成

c# - SQL 服务器未显示在 Microsoft Visual Studio 2010 上

c# - 直接P2P连接

c# - DapperExtensions在插入操作时产生“无效的对象名称”

c# - Entity Framework 中没有事务的存储过程

c# - 这个 GetEnumAsStrings<T>() 方法是在重新发明轮子吗?