实体框架黑客攻击

时间:2012-01-30 10:34:24

标签: c# entity-framework entity-framework-4

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

这是一个自然的关键所以它有时必须改变。实体框架阻止更改密钥。但是我设法将Inserts / Updates / Deletes绑定到存储过程。他们得到一个额外的参数 - NexIndex,它在执行sproc时成为DocumentItem的新索引。

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

包含文件项目的文件:

1。 2。 3。 4。 5。

用户删除数字3并添加新位置(总是在最后,用户无法重新排序项目。)

变更列表: 删除3(确定) 更新4 - > 3(好的) 更新5 - > 4(好的) 插入5 - 这是它打破的地方

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

现在的情况如下:EF认为它已经有索引为5的项目,因此最后一次插入会中断。

我需要做一些事情来清除更新项目的对象状态,以便我可以添加新的或附加或从数据库下载它们。 我该怎么办?

1 个答案:

答案 0 :(得分:2)

对数据库这样做一般都很痛苦。您可以在数据库中包含订单列,但不要将其用作“实际订单”而没有间隙。如果删除order = 3的项目,那就这样吧。会有差距。当您插入新项目时,请使用order = 6添加它。您的项目仍将以正确的顺序排序。

如果你不喜欢这个想法,请回到ADO.NET或不使用order作为密钥的一部分。