简体   繁体   English

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

[英]Entity Framework configuration for a Required to Optional relationship

I'm having some problems with what I thought should be a simple EF relationship. 我认为应该是简单的EF关系时遇到了一些问题。 I have an Email entity which has a ModerationResult Navigation property, and the ModerationResult entity has a ManualModerationReason Navigation property. 我有一个具有ModerationResult Navigation属性的Email实体,而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; }
    ...
}

The configuration we have for the Email and ModerationResult is working fine. 我们为Email和ModerationResult进行的配置工作正常。 An Email can have ZERO or ONE ModerationResult associated with it. 电子邮件可以关联零或一个ModerationResult。 The result of this in our DB is that we have a ModerationResult table which has a field 'Email_EmailId' to relate to the relevant Email. 在数据库中的结果是,我们有一个ModerationResult表,该表具有与相关电子邮件相关的字段'Email_EmailId'。

The next part is where I'm having problems. 下一部分是我遇到问题的地方。 I've added a new ManualModerationReason Navigation property to ModerationResult. 我向ModerationResult添加了一个新的ManualModerationReason Navigation属性。 A ModerationResult can have ZERO or ONE ManualModerationReason associated with it. 一个ModerationResult可以具有零或一个与其相关的ManualModerationReason。

I've created the DbSet configuration for this new ManualModerationReason entity, and the DB now has a ManualModerationReason table comprising of the 2 fields (ManualModerationReasonId and Reason). 我已经为这个新的ManualModerationReason实体创建了DbSet配置,并且数据库现在具有一个包含2个字段(ManualModerationReasonId和Reason)的ManualModerationReason表。 This is essentially a lookup table. 这本质上是一个查找表。

public DbSet<ManualModerationReason> ManualModerationReason { get; set; }

I've tried various configurations for the mapping between the ModerationResult entity and its new ManualModerationReason property, but none are working as desired. 我已经尝试了ModerationResult实体与其新的ManualModerationReason属性之间的映射的各种配置,但是没有一种能够按预期工作。 For example, when I've retrieved a ManualModerationReason object from the Db, then assigned that object to the Email.ModerationResult.ManualModerationReason property, and SavedChanges, I've ended up with a new record in the ManualModerationReason lookup table, and the ForeignKey field in my ModerationResult table (ManualModerationReason_ManualModerationReasonId) remains NULL! 例如,当我从Db中检索ManualModerationReason对象,然后将该对象分配给Email.ModerationResult.ManualModerationReason属性和SavedChanges时,我在ManualModerationReason查找表和ForeignKey字段中得到了一条新记录在我的ModerationResult表(ManualModerationReason_ManualModerationReasonId)中仍然为NULL!

Can anyone please shed any light on what the correct Fluent configuration should be for this requirement? 任何人都可以就此要求的正确Fluent配置进行说明吗? This is how it currently looks in my most recent failed attempt: 这是我最近一次失败的尝试中当前的样子:

modelBuilder.Entity<ModerationResult>().HasOptional( m => m.ManualModerationReason );

UPDATE: As requested, this is currently how the saving code looks: 更新:根据要求,当前是保存代码的外观:

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();
    }
}

Don't you think you are missing the navigational property in ManualModerationReason class? 您是否不认为您在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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM