Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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_Ef Database First - Fatal编程技术网

C# 在关系数据库中保持实体顺序的最佳模式是什么?

C# 在关系数据库中保持实体顺序的最佳模式是什么?,c#,sql-server,entity-framework,ef-database-first,C#,Sql Server,Entity Framework,Ef Database First,环境:ASP.NET MVC应用程序,带有EF(首先控制数据库设计的数据库)和Sql Server 我有很多具有用户生成属性的实体。我需要一种方法让用户能够指定这些元素的顺序 更详细一点:用户可以创建一个“模板”,然后添加“属性”。这些“属性”需要排序。还有>=4种其他不同的实体类型也需要用户指定的排序 我对前端方面没有问题,但我想知道在sql server中保持元素顺序的最佳方法是什么 对我来说,显而易见的解决方案是给每个实体一个列“顺序”(或另一个非关键字名称),并在重新排序(例如,将元素4

环境:ASP.NET MVC应用程序,带有EF(首先控制数据库设计的数据库)和Sql Server

我有很多具有用户生成属性的实体。我需要一种方法让用户能够指定这些元素的顺序

更详细一点:用户可以创建一个“模板”,然后添加“属性”。这些“属性”需要排序。还有>=4种其他不同的实体类型也需要用户指定的排序

我对前端方面没有问题,但我想知道在sql server中保持元素顺序的最佳方法是什么

对我来说,显而易见的解决方案是给每个实体一个列“顺序”(或另一个非关键字名称),并在重新排序(例如,将元素4移动到2)时更新所有受影响的实体


这是解决此问题的最佳方法吗?

这听起来不像是一个小项目,您可能在
SortOrder
属性上有其他各种动态自定义

向实体表中添加
SortOrder
列肯定不是一种坏方法,但这种方法可能会用不一定属于该实体的信息阻塞数据(特别是如果多个用户可以自定义相同的实例)

所以我有另一个想法给你:

  • CustomizationNode
    表(或类似内容)添加到数据库中
这里存储
SortOrder
,以及其他类型的元数据和用户自定义,它们不一定是概念实体的一部分

然后,如果您需要添加/更改/删除任何自定义信息,您只需要在一个表中执行,而不需要在多个表中执行并且您无需在更改自定义功能时迁移实体。

根据您的情况,您可以通过以下几种方式之一将它们链接起来:

1.向每个实体表添加一列
CustomizationNodeId
这涉及到对每个实体实例进行单个自定义,是最简单的解决方案。 此外,一个定制可以在同一类型的多个实体(甚至不同类型的实体)之间共享,尽管这可能没有多大意义

2.将多列
EntityXId
EntityYId
添加到
CustomizationNode
表中。 原则上,这些ID字段中只有一个将被填充,其他字段将为空。可能看起来有点“不对劲”,但不一定是错误的做法

虽然您失去了跨同一类型的多个实体共享自定义项的能力,但您获得了对每个实体和其他FK(如用户ID)进行多个自定义的能力。这将允许您对每个用户进行自定义

3.在每个
EntityX
CustomizationNode
这是最复杂但也是最通用的解决方案。它体现了向每个要链接的表添加一个带有FK的表

您获得的一个重要好处是额外的解耦。定制和实体不知道彼此的存在和变化而不会相互影响

此外,您还可以向这些链接表添加额外的元数据,这样您就可以在上面1和2中提到的所有内容的基础上进行版本控制


底线是,如果您的应用程序是高度动态和可定制的,那么您可能希望将“元数据”与实际的“数据”分开存储。

是的,这是一种很好的方法。您可以将“attr desc”保存在一列中,也可以将order属性和方向保存在单独的列中。在查询中包括此保存的订单。我也喜欢下面的答案。但请不要将列命名为“Order”,因为它是sql server中的关键字。如果您使用关键字作为列名,则在尝试编写查询时会产生所有类型的语法问题。我认为这是一种很好的方法。@user7396598 Ha,谢谢提醒。我将其改为
SortOrder
,以防止未来读者遇到潜在的麻烦:)谢谢你的回答。现在我将使用SortOrder列。订单不会在用户之间更改,也不会因任何其他原因更改。如果在某个时候我需要额外的定制,我认为调查您提出的备选解决方案之一是有意义的。[编辑以删除不推荐的信息]