实体框架 - 更新实体

时间:2016-08-15 20:05:36

标签: sql-server winforms entity-framework exception

我使用EF时遇到了更新问题。在从WbsElement_All实体更新期间,我得到以下异常:

  

无法确定相关操作的有效排序。由于外键约束,模型要求或存储生成的值,可能存在依赖关系。

我不知道为什么我会收到这样的错误,因为插入操作正常。

数据库结构如图所示。

DB diagram

一些解释,可能会有所帮助:

  • 数据存储在表格中(图表中的表格架构)
  • 该视图用于获取数据。此外,ef模型基于视图(视图映射到实体)
  • 使用存储过程执行CRUD操作。 (存储过程在EF中映射)

如您所见,表Tables.ProgramWbs具有一个素数键,即使用两列。代码如下:

CREATE TABLE [LTP2].[SAPProject](
[ProgramID] [int] NOT NULL,
[WbsElementLevel1ID] [int] NOT NULL,
CONSTRAINT [PK_SAPProject] PRIMARY KEY CLUSTERED 
(
[WbsElementLevel1ID] ASC,
[ProgramID] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
ON [PRIMARY]
) 
ON [PRIMARY]

此表中还使用了Tables.WbsElement(字段PK_ID)中定义的WbsElement。因此,通常该表正在解析多对多关系(许多程序可以分配给许多WbsElements,而相反方向则相同)。我不知道为什么这个表是以这种方式设计的,但这是一个不同的主题。

如前所述在EntityFramework中映射了视图。所以定义如下: 1. WbsElement:

    public partial class WbsElement
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public WbsElementLevel1()
    {
        this.ProgramWbss = new HashSet<ProgramWbs>();
    }

    public int PK_ID { get; set; }
    public string WbsElement { get; set; }
    public string Name { get; set; }
    public Nullable<int> ProgramID { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<ProgramWbs> ProgramWbss { get; set; }
}
  1. ProgramWbs

    public partial class ProgramWbs
    {
        public int ProgramID { get; set; }
        public int WbsID { get; set; } 
        public virtual WbsElement WbsElement { get; set; }
        public virtual Program Program { get; set; }
    }
    
  2. 我认为,就在这一刻,所有人都要描述这种架构。这很奇怪,只有在更新时才会出现此错误。插入工作正常。 存储过程已正确映射。基本上问题出在EF端(我认为),因为在SQL分析器中,我在更新时看不到任何过程调用。因此错误得到了早期的认可。

    生成异常的代码如下所示:

    var wbsElement = new WbsElement(){ Name="Dummy_1"}; 
    this.Context.WbsElem‌​ents.Add(wbsElement); 
    this.Context.SaveCha‌​nges(); 
    wbsElement.Name="Cha‌​nged dummy name"; 
    this.Context.SaveCha‌​nges();    //error statement
    

    在EF设计器中,主键设置正确。

    希望somone可以给我一个暗示正在发生的事情。 亲切的问候。

0 个答案:

没有答案