C# 实体框架黑客攻击

C# 实体框架黑客攻击,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,我有一个名为DocumentItem的实体。它有一个自然键,由两列组成:DocumentId(文档的id)和Index(文档中项目的位置) 这是一个自然键,因此有时必须更改。实体框架防止对密钥进行更改。但是,我已经成功地将插入/更新/删除绑定到存储过程。它们得到一个额外的参数-NexIndex,当存储过程执行时,它将成为DocumentItem的新索引 但是有一个问题:管理对象状态管理器,使其具有当前有效的信息。想象一下这样的情况: 包含文档项的文档: 一,。 2. 3. 4. 五, 用户删除编

我有一个名为DocumentItem的实体。它有一个自然键,由两列组成:DocumentId(文档的id)和Index(文档中项目的位置)

这是一个自然键,因此有时必须更改。实体框架防止对密钥进行更改。但是,我已经成功地将插入/更新/删除绑定到存储过程。它们得到一个额外的参数-NexIndex,当存储过程执行时,它将成为DocumentItem的新索引

但是有一个问题:管理对象状态管理器,使其具有当前有效的信息。想象一下这样的情况:

包含文档项的文档:

一,。 2. 3. 4. 五,

用户删除编号3并添加一个新位置(始终在末尾,用户无法重新排序项目)

更改列表: 删除3(确定) 更新4->3(确定) 更新5->4(确定) 插入5-这是它断开的地方

问题是实体框架不知道索引的变化。我尝试从数据库中绑定索引,但它总是导致异常“无法确定有效的操作顺序…”

现在情况如下:EF认为它已经有了索引为5的项,所以最后一次插入中断

我需要做一些事情来清除更新项目的对象状态,以便我可以添加新的、附加的或从db下载它们。
我能做什么呢?

用数据库做这件事总的来说是件麻烦事。您可以在数据库中设置订单列,但不要将其用作没有间隙的“真实订单”。如果您删除订单=3的项目,那么就这样吧。会有一个缺口。插入新项目时,按订单=6添加。您的物品仍将按正确顺序订购


如果您不喜欢这个想法,请返回ADO.NET,或者不要将顺序作为密钥的一部分。

为什么不将Id作为主键,而不是所有黑客攻击的复合键?不,因为这不是我的决定。此外,我同意这是正确的做法。我讨厌糟糕的工具会影响设计的想法。我不同意改变文档的显示顺序应该是主键的一部分。它不描述文档的身份。它不是关于文档,而是关于文档的位置/项目。只能有一个位置具有数字1、2、3、,。。。说第215号文件的位置1清楚地标识了文件项。但说第215号文件肯定也是这样吗?您可以使排序字段唯一,但数据库键在概念上是对象的绝对标识,并且排序信息随时间而变化。然而,无论你在哪里显示一个文档,它仍然是同一个文档。这是一个ASP.NET MVC网站-正确的索引来自html表单(丰富的javascript),然后由控制器检查(自定义验证),然后是知道应该做什么操作的服务层。更重要的是,删除/插入不等于更新项目,因为在后台有库存管理(FIFO/LIFO方法)。我做了一些测试,发现只要将对象从对象上下文中分离就可以解决问题。