我使用EF时遇到了更新问题。在从WbsElement_All实体更新期间,我得到以下异常:
无法确定相关操作的有效排序。由于外键约束,模型要求或存储生成的值,可能存在依赖关系。
我不知道为什么我会收到这样的错误,因为插入操作正常。
数据库结构如图所示。
一些解释,可能会有所帮助:
如您所见,表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; }
}
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; }
}
我认为,就在这一刻,所有人都要描述这种架构。这很奇怪,只有在更新时才会出现此错误。插入工作正常。 存储过程已正确映射。基本上问题出在EF端(我认为),因为在SQL分析器中,我在更新时看不到任何过程调用。因此错误得到了早期的认可。
生成异常的代码如下所示:
var wbsElement = new WbsElement(){ Name="Dummy_1"};
this.Context.WbsElements.Add(wbsElement);
this.Context.SaveChanges();
wbsElement.Name="Changed dummy name";
this.Context.SaveChanges(); //error statement
在EF设计器中,主键设置正确。
希望somone可以给我一个暗示正在发生的事情。 亲切的问候。