【发布时间】:2013-12-15 09:36:22
【问题描述】:
我目前在我的代码优先实体框架Context 中使用Guid 作为我的ContentItems 的主键。但是,由于Guid 非常笨拙,我还想根据以下逻辑为每个ContentItem(或ContentItem 的后代)设置一个备用的友好ID:
- 使用
Name属性来降低,用-替换空格,并用-结束前缀 - 在数据库中查找其他
ContentItem有相同前缀的FriendlyID,并找到具有最高数字后缀的那个 - 将其增加 1 并添加为后缀
所以名称为“Great Story”的第一个项目将有 FriendlyID 或 great-story-1,下一个是 great-story-2,依此类推。
我知道有很多方法可以实现这种事情,但这里有我的问题:
- 是否建议根据此逻辑显式设置具有备用 ID 的新字段,还是应该每次应用与生成 ID 以查找正确对象相同的规则时运行查询?
- 我应该如何强制设置备用 ID?我应该在创建时为每个内容项在我的服务方法中执行此操作吗? (这让我很担心,因为如果有人忘记将该逻辑添加到服务方法中,现在该对象没有
FriendlyID)或者我应该在模型本身中使用具有手动定义的 getter/setter 的属性必须查询数据库并找出下一个可用的FriendlyID是什么? - 除了使用这种
FriendlyID来进行人性化的URL 和Web 服务请求之外,还有其他方法吗?这个东西的最终目的真的是让我们可以让用户去http://awesomewebsite.com/Content/great-story-1并被发送到正确的内容项,而不是http://awesomewebsite.com/Content/f0be271e-ee01-48de-8599-ddd602e777b6等。
【问题讨论】:
-
可以更改名称或删除或停用项目吗?如果是这样,您是否希望 FriendlyId 稳定?当用户返回一个 5 年前的链接时,预期的行为是什么?我的猜测是它应该被存储而不是动态生成。并且您需要保留以前使用的所有值,以免重复使用它们。
-
看这个页面的url:stackoverflow.com/questions/20593139/…
-
@HABO - 好点。你是对的 - 即使我对返回的结果进行了排序
CreatedDate,比如说,如果有任何一个被删除,它就会把整个计划扔掉。
标签: sql-server asp.net-mvc entity-framework ef-code-first indexing