【发布时间】:2018-07-10 00:49:13
【问题描述】:
使用 EF6 和 SQL Server。这个问题是问我的代码是否朝着正确的方向发展。
使用各种 SO 帖子,我能够定义包含列表并合并 IComparable(Of T) 的类。尽管列表中的对象具有可用于排序的属性(例如日期),但我需要维护一个用户定义的顺序,该顺序完全取决于用户希望如何排列对象。
我的第一个假设是我必须维护一个独特的属性来维护用户定义的顺序。那是对的吗?这是我当前定义的一个非常简化的示例:
Class Parent
:
Public Property SomeList as List(Of Something)
End Class
Class Something
Implements IComparable(of Something)
:
public property PositionInList as Integer
Public Function CompareTo(that As Something) As Integer ...
Return PositionInList.CompareTo(that.PositionInList)
End Function
End Class
如果我写以下内容:
dim aList as New List(Of Something)
aList = Parent.SomeList
aList.Sort()
...alist 按照我的预期是基于 PositionInList 排序的。
如果我想在列表中插入一条新记录,我是否负责在列表中的所有对象中更改 PositionInList 的值?我问的原因是因为.insert(index,object) 形式的LINQ 命令表明它将一个元素插入到指定索引处的List(Of T) 中。当我在SaveChanges() 之前查看.insert(index,object) 之后的表格时,该列表确实在正确的位置有新对象,但它没有将PositionInList 设置为.insert(index,object) 中指定的索引值。应该是这样,我没有正确编码吗?此外,PositionInList 将不得不影响所有对象的变化——我对此负责吗?
我需要学习哪些预定义的方法可以在我插入时操纵 PositionInList?
我还希望用户能够将项目移动到列表中的新位置。是否有做这种事情的模式,还是这完全取决于我?
根据请求在下面的评论中添加:
应用分为3层:UI、域、存储。存储层包括一个存储服务类,它具有与 SQL Server 接口的 CRUD 方法。
这是当前Create 方法之一。目前它只在列表末尾附加一条记录。根据您的评论,当对 create 的调用请求在列表中的某处插入时,我将对其进行修改以更新 PositionInList。这将需要方法中当前未编码的附加参数。
Public Overrides Sub ElementCreate(DomainElement As DomainElement)
Dim aSqlElement As New SqlElement
aSqlElement.DomainToSqlElement(DomainElement)
Dim theParent = SqlContext.SqlContents.Include("ContentElements").Where(Function(x) x.ID = aSqlElement.ContentID).SingleOrDefault()
theParent.ContentElements.Add(aSqlElement)
SqlContext.SaveChanges()
End Sub
【问题讨论】:
-
是的,您有责任在列表更改时更新该属性。你能把修改列表的代码贴出来吗?
-
感谢您确认我需要管理列表中的职位。根据您的要求,我只发布了上面当前的 Create 方法。
标签: sql-server vb.net list linq