加载实体时违反多重约束错误

问题描述 投票:0回答:1

我已经看到这个问题已被问过多次,但每个问题都有自己的情况,我找不到解决方案。

我想添加一个包含调查数据的表格,每个SURVEY都属于SITE

我尝试添加一个子表Site_Survey,如果形成一对一Zero_or_One关系到退出表Site_Report

enter image description here

我正在使用EF-6,代码优先,使用FluentApi进行映射。以下是我如何定义实体

现场调查

public class Site_Survey
    {
        // Scalar Properties
        public int site_survey_id { get; set; }
        // ..other properties removed for brevity


        // Navigation Properties
        public virtual Site_Report Site_Report { get; set; }
    }

Site_Report

public class Site_Report
    {
        public Site_Report()
        {
            this.Report_Assets = new HashSet<Report_Asset>();
            this.Site_Survey = new Site_Survey();
        }

        // Scalar Properties
        public int site_report_id { get; set; }
        // ..other properties removed for brevity

        // Navigation Properties
        // Site_Report one-to-zero_or_one Site_Survey
        public virtual Site_Survey Site_Survey { get; set; }
    }

制图

public class Site_SurveyMap : EntityTypeConfiguration<Site_Survey>
    {
        public Site_SurveyMap()
        {
            HasKey(x => x.site_survey_id);
        }
    }

public class Site_ReportMap : EntityTypeConfiguration<Site_Report>
    {
        public Site_ReportMap()
        {
            HasKey(one => one.site_report_id);

            // mapping for Site_Report one-to-zero_or_one Site_Survey
            HasOptional(o => o.Site_Survey)         // Mark Site_Survey property optional in Site_Report entity
            .WithRequired(o => o.Site_Report)       // Mark Site_Report property as required in Site_Survey entity. 
            .WillCascadeOnDelete(true);             // i.e. Cannot save Site_Survey without Site_Report
        }
    }

我在Site_Report构造函数中初始化Site_Survey,以便每个新的Site_Report最多只有一个调查。对于在Survey表中没有记录的旧现有站点,我正在添加代码逻辑并在必要时填充它们。

问题

从DbContext开始,在自己加载Site_Survey对象的同时,我成功获得了正确的调查记录

Site_Survey model = ctx.Site_Survey.Where(i => i.site_survey_id == id).FirstOrDefault();

但是,如果我尝试在上下文中包含Site_Report实体,则会抛出错误。

Site_Survey model = ctx.Site_Survey.Include(i => i.Site_Report).Where(i => i.site_survey_id == id).FirstOrDefault();

反之亦然,如果尝试加载Site_Report并包含Site_Survey。

错误

“违反了多重约束。关系'StevensCalcertPortal.DBAccessLayer.Site_Report_Site_Survey'的角色'Site_Report_Site_Survey_Target'具有多重性1或0..1。”

事实上它实际上是1-0..1关系,我做错了什么?

entity-framework-6 fluent-nhibernate-mapping
1个回答
0
投票

在阅读本文Entity framework and Table splitting with Code First的帮助下。以下更改实际解决了我的问题。

保持Site_Report构造函数不变,并使用单独的静态方法CreateEntity()生成对象。同时将构造函数的可见性更改为protected以强制使用静态方法,其中代码中需要new Site_Report();

public class Site_Report
    {
        public static Site_Report CreateEntity()
        {
            return new Site_Report()
            {
                Site_Survey = new Site_Survey()
            };
        }

        protected Site_Report()
        {
            this.Report_Assets = new HashSet<Report_Asset>();
            // this.Site_Survey = new Site_Survey();
        }
    }

如果在构造函数this.Site_Survey = new Site_Survey();中初始化Site_Survey,基本上会发生错误。

在向数据库发出查询后的EF内部,当构造Site_Report的实例时,它得到了Site_Survey已经填充了ID为0而EF抱怨因为它从数据库中获得了不同的ID,所以EF认为Site_Reportre指向两个不同的Site_Survey时关系是1:1(他们应该共享相同的id)。

© www.soinside.com 2019 - 2024. All rights reserved.