[英]How to create field and get data from joined table in Entity Framework 6
[英]How to Create Data or Entity Relationship on the same Table and Join another Table on the first Joined Table?
我在使用同一个表构建数据或实体关系并将另一个表连接到第一个内部连接表时遇到问题。
我想以这种方式获取查询结果:
SELECT [n].[ISCInstanceId], [n].[NavPointId], [n].[ParentNPId], [n].[DataPointId], [n].[NodeOrder], [n].[RefNumber], [n].[TreeTitle], [n].[IsArchived], [n].[IsInNavbar], [i].[Name]
FROM [NavPoints] AS [n]
INNER JOIN [NavPoints] AS [n0] ON [n].[ParentNPId] = [n0].[NavPointId]
INNER JOIN [ISCInstances] AS [i] ON [n0].[ISCInstanceId] = [i].[ISCInstanceId]
WHERE (([n].[IsArchived] = CAST(0 AS bit)) AND ([n].[IsInNavbar] = CAST(1 AS bit))) AND ([n0].[ISCInstanceId] = @__IscinstanceId_0)
ORDER BY [n].[ParentNPId], [n].[NodeOrder]
但我得到了这个:
SELECT [n].[ISCInstanceId], [n].[NavPointId], [n].[ParentNPId], [n].[DataPointId], [n].[NodeOrder], [n].[RefNumber], [n].[TreeTitle], [n].[IsArchived], [n].[IsInNavbar], [i].[Name]
FROM [NavPoints] AS [n]
INNER JOIN [NavPoints] AS [n0] ON [n].[ParentNPId] = [n0].[NavPointId]
INNER JOIN [ISCInstances] AS [i] ON [n].[ISCInstanceId] = [i].[ISCInstanceId]
WHERE (([n].[IsArchived] = CAST(0 AS bit)) AND ([n].[IsInNavbar] = CAST(1 AS bit))) AND ([n0].[ISCInstanceId] = @__IscinstanceId_0)
ORDER BY [n].[ParentNPId], [n].[NodeOrder]
问题是部分或行INNER JOIN [ISCInstances] AS [i] ON [n].[ISCInstanceId] = [i].[ISCInstanceId]女巫是我得到的查询没有加入第一个内部连接表,我希望它像这样INNER JOIN [ISCInstances] AS [i] ON [n0].[ISCInstanceId] = [i].[ISCInstanceId]
数据库上下文
modelBuilder.Entity<NavPoint>(entity =>
{
...
entity.HasOne(d => d.Iscinstances)
.WithMany(p => p.NavPoints)
.HasForeignKey(d => d.IscinstanceId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_NavPoints_Iscinstances");
entity.HasOne(d => d.NavPointsParent)
.WithMany(p => p.NavPoints)
.HasForeignKey(d => d.ParentNpid)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_NavPoints_NavPoints");
});
类模型
// <auto-generated> This file has been auto generated by EF Core Power Tools. </auto-generated>
#nullable disable
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace Odysseus_API.Models
{
public partial class NavPoint
{
public NavPoint()
{
NavPoints = new HashSet<NavPoint>();
}
[key]
public int NavPointId { get; set; }
public int ParentNpid { get; set; }
...
[ForeignKey("ParentNpid")]
public virtual NavPoint NavPointsParent { get; set; }
public virtual Iscinstance Iscinstances { get; set; }
[ForeignKey("NavPointId")]
public virtual ICollection<NavPoint> NavPoints { get; set; }
}
}
控制器
[HttpGet]
public async Task<ActionResult<NavPoint>> GetNavPoint(int IscinstanceId)
{
if (_context.Users == null)
{
return NotFound();
}
var navpoint = await _context.NavPoints
.Where(c => c.IsArchived == false && c.IsInNavbar == true && c.NavPointsParent.IscinstanceId == IscinstanceId)
.Include(c => c.NavPointsParent).Include(c => c.Iscinstances)
.OrderBy(c => c.ParentNpid).ThenBy(c => c.NodeOrder)
.Select(c => new NavPoint
{
...
})
.ToListAsync();
if (navpoint == null)
{
return NotFound();
}
return Ok(navpoint);
}
基本上你所拥有的是:
var navpoint = await _context.NavPoints
.Include(c => c.NavPointsParent)
.Include(c => c.Iscinstances)
Include
始终适用于查询的根,因此您包含_context.NavPoints
Iscinstances
这将具有相同的效果:
var navpoint = await _context.NavPoints
.Include(c => c.Iscinstances)
.Include(c => c.NavPointsParent)
要Include
Iscinstances
的NavPointsParent
,请使用:
var navpoint = await _context.NavPoints
.Include(c => c.NavPointsParent)
.ThenInclude(c => c.Iscinstances)
ThenInclude
扩展了先前的Include
。
在您发表评论之后:这里的重点是您需要导航属性c.NavPointsParent.Iscinstance
,即使不使用Include
也是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.