我的数据模型如下。
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及其子级保存在一起来实现这一目标?
请提出建议。提前致谢。
答案 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);