在另一个实体中引用两次的同一个实体在将父级与子级一起保存时造成了问题

时间:2018-09-25 05:12:28

标签: entity-framework

我的数据模型如下。

class KnowledgeDocument
{
   public int? Id {get; set;}
   public virtual ICollection<KDValueCreation> KDValueCreations { get; set; }
}

class KDValueCreation
{
    public int? Id{get; set;}
    public int? KDReferenceId { get; set; }
    public virtual KnowledgeDocument KDReference { get; set; }
    public int KnowledgeDocumentId { get; set; }
    public virtual KnowledgeDocument KnowledgeDocument { get; set; }
    public decimal Amount {get; set;}
}

现在,当我尝试与KnowledgeDocument一起创建新的KDValueCreations时,如下所示。

KnowledgeDocument kd = new KnowledgeDocument();

kd.KDValueCreations.Add(new KDValueCreation{ Amount = "500000"});

当我保存kd时,kd被保存而没有任何问题,并且在KDValueCreation中创建了1条记录,并且KDReferenceId和KnowledgeDocumentId都填充了相同的kdId。但是,我只想填充KnowledgeDocumentId并阻止KDReferenceId填充并将其设置为null。

由于两个字段都指向相同的引用,因此实体框架正在两个字段上填充ID。

如何通过将KnowledgeDocument及其子级保存在一起来实现这一目标?

请提出建议。提前致谢。

1 个答案:

答案 0 :(得分:0)

如我所见,原因是两个完全相同的关系。您需要指定相关的属性。您可以通过InverseProperty属性或通过FluentAPI来做到这一点:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // configures one-to-many relationship
    modelBuilder.Entity<KDValueCreation>()
        .HasRequired<KnowledgeDocument>(c => c.KnowledgeDocument)
        .WithMany(d => d.KDValueCreations)
        .HasForeignKey(c => c.KnowledgeDocumentId);
      }
}

或者这个:

modelBuilder.Entity<KnowledgeDocument>()
    .HasMany<KDValueCreation>(d => d.KDValueCreations)
    .WithRequired(c => c.KnowledgeDocument)
    .HasForeignKey(c => c.KnowledgeDocumentId);