“必需到可选”关系的实体框架配置

时间:2015-04-10 12:36:05

标签: c# entity-framework

我遇到了一些我认为应该是简单的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();
    }
}

1 个答案:

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