c# – 实体核心查询在急切加载导航属性时仅返回一个项目
发布时间:2020-12-15 22:36:37 所属栏目:百科 来源:网络整理
导读:使用Entity Core创建一个简单的restful Web API.我遇到的问题是,当使用简单的context.Users.ToListAsync()查询时,我收到数据库中所有用户的列表,但是,当加载一对一关系导航属性时(context.Users.Include( u = u.Status).ToListAsync(),我总是只收到我数据库
使用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调用. 有人能告诉我我做错了什么吗?一对一关系是否设置错误? ym数据初始化?我无法想出这个. 非常感谢你的时间! 解决方法
调试帮助我找到了解决方案,谁会想到?
我从Json序列化器获得了一个Loop Reference处理错误.当然,我的模型使用循环引用来导航属性.我在序列化时忽略了这些问题,从而解决了这个问题.在另一个问题上特别使用此解决方案 https://stackoverflow.com/a/38382021/7087278 该解决方案描述了ASP.net Core的过程,这正是我所需要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |