我遇到了一些我认为应该是简单的EF关系的问题。 我有一个Email实体,它有一个ModerationResult Navigation属性,而ModerationResult实体有一个ManualModerationReason Navigation属性。
public class Email
{
public int EmailId { get; set; }
public ModerationResult ModerationResult { get; set; }
...
}
public class ModerationResult
{
public int ModerationResultId { get; set; }
public ManualModerationReason ManualModerationReason { get; set; }
...
}
public class ManualModerationReason
{
public int ManualModerationReasonId { get; set; }
public string Reason { get; set; }
...
}
我们为Email和ModerationResult配置工作正常。电子邮件可以与ZERO或ONE ModerationResult相关联。我们的数据库中的结果是我们有一个ModerationResult表,其中有一个字段'Email_EmailId'与相关的电子邮件相关。
下一部分是我遇到问题的地方。我已经向ModerationResult添加了一个新的ManualModerationReason Navigation属性。 ModerationResult可以与ZERO或ONE ManualModerationReason相关联。
我为这个新的ManualModerationReason实体创建了DbSet配置,并且DB现在有一个包含2个字段的ManualModerationReason表(ManualModerationReasonId和Reason)。这本质上是一个查找表。
public DbSet<ManualModerationReason> ManualModerationReason { get; set; }
我已尝试过ModerationResult实体与其新的ManualModerationReason属性之间的映射的各种配置,但没有一个按预期工作。例如,当我从Db检索到ManualModerationReason对象,然后将该对象分配给Email.ModerationResult.ManualModerationReason属性和SavedChanges时,我最终在ManualModerationReason查找表和ForeignKey字段中找到了新记录。在我的ModerationResult表(ManualModerationReason_ManualModerationReasonId)中保持为NULL!
任何人都可以了解这个要求的正确Fluent配置应该是什么?这是我最近失败尝试的目前情况:
modelBuilder.Entity<ModerationResult>().HasOptional( m => m.ManualModerationReason );
更新:根据要求,目前这是保存代码的外观:
public void Save( Email email )
{
using ( var ctx = new ModerationContext() )
{
ctx.Entry( email ).State = email.EmailId == 0 ? EntityState.Added : EntityState.Modified;
if ( email.ModerationResult != null )
{
ctx.Entry( email.ModerationResult ).State = email.ModerationResult.ModerationResultId == 0 ? EntityState.Added : EntityState.Modified;
if ( email.ModerationResult.ManualModerationReason != null )
{
ctx.Entry( email.ModerationResult.ManualModerationReason ).State = EntityState.Modified;
}
}
ctx.SaveChanges();
}
}
答案 0 :(得分:0)
您认为自己是否缺少ManualModerationReason类中的导航属性?
public class ModerationResult
{
public int ModerationResultId { get; set; }
public int ManualModerationReasonId { get; set; }
[ForeignKey("ManualModerationReasonId ")]
public ManualModerationReason ManualModerationReason { get; set; }
}
public class ManualModerationReason
{
public int ManualModerationReasonId { get; set; }
public string Reason { get; set; }
public List<ModerationResult> ModerationResults { get; set; }
}
modelBuilder.Entity<ManualModerationReason>()
.HasMany(mreason => mreason.ModerationResults)
.WithOptional(mresult => mresult.ManualModerationReason)
.HasForeignKey(mresult => mresult.ManualModerationReasonId);