entity-framework - 如何使用 Fluent Api 使我的结构与 EF Core 一起工作?
问题描述
我正在尝试使用 ef core 和 postgre sql 来表示某种树。我有两节课:
public class ProtocolNode
{
public Guid Id { get; set; }
public string Name { get; set; }
public ICollection<ProtocolCriteria> Criterias { get; set; }
public ProtocolNode()
{
Criterias = new List<ProtocolCriteria>();
}
}
public class ProtocolCriteria
{
public Guid Id { get; set; }
public Guid? ParentId { get; set; }
public ProtocolNode Parent { get; set; }
public Guid? ChildrenId { get; set; }
public ProtocolNode Children { get; set; }
}
之后,我尝试运行迁移以创建数据库,但出现错误:
无法确定“ProtocolNode”类型的导航属性“ProtocolCriteria.Parent”表示的关系。手动配置关系,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略此属性。
我假设我需要使用 Fluent API 制定一些规则,但经过一些尝试后我被卡住了......我会感谢任何帮助。
解决方案
一般来说,自上而下的树结构由具有两个主要属性的相等节点组成,父节点和兄弟节点
public class node {
public int Id {get; set;}
public int? ParentId {get; set;} // top node has no parent
public virtual Node Parent {get; set;}
public virtual ICollection<Node> Children {get; set;}
}
builder.Entity<Node>() // ModelBuilder
.HasOptional(c => c.Parent)
.WithMany()
.HasForeignKey(c => c.ParentId);
EF 使得解析子节点比维护链接列表更容易。这假设您不是在谈论二叉树,这是一种特殊情况。
注意:EF Core 尚未实现 HasOptional() 功能。
推荐阅读
- javascript - 为什么没有在反应中设置下拉菜单的初始值?
- javascript - 如何使用 setTimeout() 在 React 中使用 hooks 来加载状态?
- database - Flutter:尝试使用 OnTap 突出显示 ListTile
- botframework - 聊天机器人在模拟器和 Azure 门户中工作,但在网络聊天中无法正常启动
- python-3.x - Python - 在netCDF文件中将UTC更改为本地时间
- django - 如何调用范围内的变量值列表 | django
- java - 如何在 Hibernate 的同一张表上建模 ManyToOne 和 ManyToMany 关系?
- java - Java程序编译后无法正常运行
- python - Python从列表中删除大于阈值的元素
- python - 如何计算列表列表中的不同元素?