使用Fluent Api

时间:2018-08-13 09:23:07

标签: c# entity-framework ef-fluent-api

我有一个名为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类中添加了另一个属性,以确保问题得到完整描述。

2 个答案:

答案 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);
    }
}

希望它可以帮助某人。