在 ef-core-2.1 中加载无外键约束的相关数据
Load related data without foreign key constraint in ef-core-2.1
我想使用预加载 O/RM 模式加载相关实体数据 Parent
。但是我不能在 ParentId
上指定外键约束,因为它会创建一个不允许的循环。目前,我正在使用内部联接显式加载父数据。
这是我正在使用的领域模型。
[Table("Category")]
public class CategoryDM
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CategoryId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
[Display(Name="Parent")]
public int ParentId { get; set; }
[NotMapped]
public CategoryDM Parent { get; set; }
}
有没有办法像这样加载相关实体?或任何其他推荐的方法来实现这一目标。
var result = _context.Category.Include(e => e.Parent);
这应该可以正常工作,这是一个示例性工作模型。
型号
public class Category : ISelfRelated<Category>
{
public int Id { get; set; }
public string Name { get; set; }
public string ThumbnailUrl { get; set; }
public int? ParentId { get; set; }
public Category Parent { get; set; }
public IEnumerable<Category> Children { get; set; }
}
车型配置
category.HasOne(c => c.Parent)
.WithMany(c => c.Children)
.HasForeignKey(c => c.ParentId)
.HasPrincipalKey(c => c.Id)
.OnDelete(DeleteBehavior.Restrict)
.IsRequired(false);
我想使用预加载 O/RM 模式加载相关实体数据 Parent
。但是我不能在 ParentId
上指定外键约束,因为它会创建一个不允许的循环。目前,我正在使用内部联接显式加载父数据。
这是我正在使用的领域模型。
[Table("Category")]
public class CategoryDM
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CategoryId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
[Display(Name="Parent")]
public int ParentId { get; set; }
[NotMapped]
public CategoryDM Parent { get; set; }
}
有没有办法像这样加载相关实体?或任何其他推荐的方法来实现这一目标。
var result = _context.Category.Include(e => e.Parent);
这应该可以正常工作,这是一个示例性工作模型。
型号
public class Category : ISelfRelated<Category>
{
public int Id { get; set; }
public string Name { get; set; }
public string ThumbnailUrl { get; set; }
public int? ParentId { get; set; }
public Category Parent { get; set; }
public IEnumerable<Category> Children { get; set; }
}
车型配置
category.HasOne(c => c.Parent)
.WithMany(c => c.Children)
.HasForeignKey(c => c.ParentId)
.HasPrincipalKey(c => c.Id)
.OnDelete(DeleteBehavior.Restrict)
.IsRequired(false);