实体框架在继承的对象

时间:2015-10-10 05:55:12

标签: c# entity-framework

我已经花了大约4个小时试图找出我在这个TPT层次结构中做错了什么,这是一个巨大的痛苦。

我有基类:

public partial class Registry
{
     public int Id_Audit{get;set;}
     public string CUD{get;set;} //Key Value
     public bool Canceled{get;set;}
     public virtual ICollection<Articles> Articles {get;set;}
     public virtual ICollection<Paid> Paids {get;set;}
     //Other base properties
}

public partial class Sale : Registry
{
     public int idsale{get;set;}
}

public partial class Cuote : Registry
{
     public int idCuote{get;set;}
     public int Consec{get;set;}
     public int Modification{get;set;}
     //Other Cuote properties
}

在运行时与Registry对象进行交互,直到它决定了哪个对象:SaleCuote,因此我创建了一个扩展类来导出基类到派生类

public partial class Registry
{
     public Sales ToSale()
     {
        Sale r = new Sale
        {
            Canceled = this.Canceled,
            CUD = this.CUD,
            Id_Auditoria = this.Id_Auditoria,
            //other properties
        };
        return r;
     }
}

同样的功能是为了cuotes。

所以我像这样使用它

Sale s = tempRegistry.ToSale();
dbContext.Registrys.Add(s);
dbContext.SaveChanges();

但每次SaveChanges()都会抛出异常:

  

INSERT语句与FOREIGN KEY约束冲突&#34; FK_Registrys_Audits&#34;。冲突发生在数据库&#34; testDB&#34;,table&#34; dbo.Audits&#34;,column&#39; Id&#39;中。   声明已经终止。

但是该属性是在SaveChanges()执行之前设置的,但在SaveChanges()之后没有。

这里有一个标题(名称略有不同,Id_Auditoria == Id_Audit,Registros_Auditoria == Registry):

Before

On Catch

After

我的数据库架构是这样的: Schema 正如您所看到的,Sale对象没有更多的操作 那么为什么它一直在抛弃那个例外呢?

1 个答案:

答案 0 :(得分:2)

大家好,最后一切都有效,我不太确定究竟是什么问题,我被迫重建实体框架模型,重命名类等,其中一个最重要的变化就是

  • 删除了继承对象之间的关系:在以前的模型中未删除默认导航属性,因此显然EntityFramework尝试读取SaleRegistry而不是基类。

感谢您的帮助。