我有一个名为Process的类,该类具有1个属性,该属性指向当前进程的父级,另一个属性是当前进程的子级列表。这两个属性都再次是Process type。
public class Process
{
public int Id { get; set; }
public int? ParentId { get; set; }
public Process Parent { get; set; }
public List<Process> Children { get; set; }
// Nodes of the Process
public List<WfModelItem> Nodes { get; set; } // added
}
public class WfModelItem
{
public int Id { get; set; }
public int? ProcessId { get; set; }
public Process Process { get; set; }
}
当一个进程没有父进程时,其ParentId为null
,每个进程也可以有一些子进程。
我将其配置如下:
public class ProcessConfiguration : EntityTypeConfiguration<Process>
{
public ProcessConfiguration()
{
this.HasMany(c => c.Children)
.WithMany();
this.HasOptional(p => p.Parent)
.WithMany();
}
}
不幸的是,当我想通过dbContext.Processes.Add(aProcess)
将其添加到数据库时,出现此错误:
不能从类型为“ Process”的属性“ Parent”到类型为“ Process”的属性“ Parent”建立关系。检查InversePropertyAttribute中的值,以确保关系定义是唯一的,并从一个导航属性对其对应的反向导航属性进行引用
如何正确配置Process类?谢谢。
更新:
我在Process
类中添加了另一个属性,以确保问题得到完整描述。
答案 0 :(得分:0)
你可以试试吗:
this
.HasMany(oj => oj.Children)
.WithOne(j => j.Parent)
.HasForeignKey(j => j.ParentId );
或
public class Process
{
public long ID { get; set; }
public long? ParentID { get; set; }
[InverseProperty("Children")]
public Process Parent { get; set; }
public virtual ICollection<Process> Children { get; set; }
}
答案 1 :(得分:0)
经过两天的调查,我找到了解决方案。我将其发布给其他读者。正如我在问题中所解释的,每个 Process 可以具有多个节点和子进程,因此一个节点可能属于一个进程及其子进程。当发生这种情况时,实体框架会抱怨'WfModelItem_Process_Source'
并引发以下异常:
违反多重性约束。关系“ ...”的角色“ WfModelItem_Process_Source”具有多重性1或0..1
为解决此问题,我如下更改了 WfModelItem 类:
public class WfModelItem
{
public int Id { get; set; }
public List<Process> Processes { get; set; }
}
并更改了配置类:
public class WfModelItemConfiguration : EntityTypeConfiguration<WfModelItem>
{
public WfModelItemConfiguration()
{
HasMany(n => n.Processes)
.WithMany(p => p.Nodes);
}
}
public class ProcessConfiguration : EntityTypeConfiguration<Process>
{
public ProcessConfiguration()
{
this.HasMany(oj => oj.Children)
.WithOptional(j => j.Parent)
.HasForeignKey(j => j.ParentId);
this.HasMany(n => n.Nodes)
.WithMany(p => p.Processes);
this.HasOptional(p => p.Parent)
.WithMany()
.HasForeignKey(p => p.ParentId);
}
}
希望它可以帮助某人。