Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架确保对象按顺序插入_C#_Sql Server_Entity Framework 6 - Fatal编程技术网

C# 实体框架确保对象按顺序插入

C# 实体框架确保对象按顺序插入,c#,sql-server,entity-framework-6,C#,Sql Server,Entity Framework 6,我的数据库中有一个表规则。我插入如下规则: Rule[] rulesToInsert = // some array of rules to insert using(var db = new MyEntities()) { foreach(var rule in rulesToInsert) db.Rules.Add(rule); db.SaveChanges(); } 当我稍后检索刚才添加的规则时,我注意到它们的顺序不同。按添加顺序检索它们的最佳方法

我的数据库中有一个表规则。我插入如下规则:

Rule[] rulesToInsert = // some array of rules to insert

using(var db = new MyEntities())
{
     foreach(var rule in rulesToInsert)
         db.Rules.Add(rule);
     db.SaveChanges();
}
当我稍后检索刚才添加的规则时,我注意到它们的顺序不同。按添加顺序检索它们的最佳方法是什么?每次添加新规则时是否应调用
db.SaveChanges()
?或者我应该添加一个名为SortOrder的新专栏为什么项目没有按照我添加的顺序添加?

编辑
id是guid(字符串),因为一个规则可以有其他规则。换句话说,我正在创建一个树结构。(规则表本身有一个外键)。当我将主键用作整数时,它崩溃了,并且它自动递增,所以我只使用了guid。我想我将添加一个单独的列,名为sort order

如果希望按照在foreach语句中添加项目的顺序插入项目,则必须做出big折衷,在每次迭代中调用
db.SaveChanges

foreach(var rule in rulesToInsert)
{
    db.Rules.Add(rule);
    db.SaveChanges();
}
我认为这是一个很大的折衷,因为对于必须插入的每个规则,您必须往返数据库,而不是像原始代码那样只进行一次往返


一种可能的解决方法是在数据库的相应表中添加一个额外的列,该列将保存顺序信息。如果这样做,您可以在rule对象中再添加一个属性,并对代码进行一些重构。然后你就会得到预期的结果

表具有排序顺序(不保证将新行添加到末尾或任何其他位置)。以任何特定顺序检索行的唯一安全方法是使用
orderby
查询

因此,是的,您需要添加一个
SortOrder
列。(只需将其设置为
标识
列即可。)

当您检索它们时,您是如何订购的,您订购的是什么?id?不,id是guid。我没有可供排序的列。我想我必须添加它。当您从基于SQL的数据库检索行时,如果您没有指定
ORDER BY
子句,则数据库引擎/优化器可以根据索引和它用来检索行的内容自由选择任何有意义的顺序。因此,这里的解决方案是指定一个
ORDER BY
子句,因此您需要一些稳定的东西来订购。如果不使用ORDER BY的话,以一个顺序插入它们对检索它们没有影响。我同意Magnus的观点。插入顺序并不决定自然顺序。db服务器将根据许多因素决定在表中插入该行的位置。通常是在最后,但不能保证。如果您希望它可靠,最好是添加一列进行排序。@Donwvoter,请您解释一下有什么问题,以便更正或删除我的答案?先谢谢你