具有必需关联的实体框架4.3

Sly*_*Sly 5 validation entity-framework lazy-loading code-first

使用EF代码第一种方法和关联,我是一个非常奇怪的行为.我有两个实体:

public class GlobalKpiSectionn
{
    public GlobalKpiSection()
    {
        this.Regions = new HashSet<Region>();
    }

    public virtual ICollection<Region> Regions { get; protected set; }  
}

public class Region
{
    public int RegionId { get; set; }

    public bool IsMain { get; set; }

    [Required]
    public virtual GlobalKpiSection KpiSection { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我需要KiSection属性的必需属性才能获得级联删除.

问题是以下 - 在此代码中:

var mainRegion = context.Regions.Single(x => x.RegionId == id);
mainRegion.IsMain = true;
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我得到的例外是必填字段未初始化.但它目前只是没有加载.当我使用这个实体时,我不会写任何明确包含属性的内容.我该怎么做才能克服这个问题?Exceptoin细节

UPDATE

我之所以确定它的延迟加载问题是因为:

        var primaryRegion = context.Regions
                                   .Include(x => x.KpiSection)
                                   .Single(x => x.RegionId == id);
Run Code Online (Sandbox Code Playgroud)

解决了这个问题,但它绝对是一个糟糕的解决方案.

Lad*_*nka 11

这就是为什么你不应该使用数据注释.数据注释是错误的功能,因为它们同时进行映射和验证(违反单一责任) - 正如您所看到的那样并不总是您想要的.所以你目前的选择是:

  • 关闭验证 context.Configuration.ValidateOnSaveEnabled = false
  • KpiSectionId在您的Region实体中公开不可为空的外键属性(您Required的导航属性不需要属性).
  • 使用流畅的API而不是数据注释:

例:

modelBuilder.Entity<GlobalKpiSection>()
            .WithMany(s => s.Regions)
            .HasRequired(r => r.KpiSection);
Run Code Online (Sandbox Code Playgroud)