导航属性列表中的连续ID

时间:2014-03-11 00:17:11

标签: c# asp.net asp.net-mvc entity-framework

我正在尝试在ASP.NET MVC 5中创建一个讨论论坛(主要是作为测试,因为我对C#/ MVC /任何编码都很新)。

我有两个课程,讨论和消息。

public class Discussion
{
    public int DiscussionID { get; set; }
    [Required]
    [Display(Name="Discussion Title")]
    public string DiscussionTitle { get; set; }

    //[Required]
    //ForumUser UserCreatedThread { get; set; }

    [Required]
    DateTime CreatedTime { get; set; }

    public ICollection<Message> Messages { get; set; }
}

public class Message
{
    public int MessageID { get; set; }

    public int MessageNumber { get; set; }

    [Required]
    [Display(Name="Message Content")]

    [DataType(DataType.MultilineText), AllowHtml]
    public string Content { get; set; }

    [Required]
    public DateTime MessageTime { get; set; }

    public virtual int DiscussionID { get; set; }
}

讨论有一个消息列表,我希望MessageID,或每个列表的1,2,3等其他属性。目前,如果创建了多个讨论,则MessageID可以是1,4,5,8等。

我开始在GetMessage()和GetDiscussion()方法中使用静态方法来修复ID,因为消息通过MessageID对线程进行排序然后迭代它们以将值更改为1,2 ,3等。

现在我已经更改了它以添加MessageNumber属性,在创建新消息时使用EF6将消息保存到数据库,检索消息,获取消息计数,将MessageNumber更新为计数并保存变化。

后者有效但我认为如果在保存消息然后检索计数之间创建新消息可能会导致问题。两条消息将具有相同的MessageNumber。

是否有更好的方法可以执行此操作,还是应该使用其他方式来访问不需要ID的邮件?

2 个答案:

答案 0 :(得分:0)

id只是表格的关键;它并不是真正意图成为用户界面的一部分,即使您经常看到网络中的网址中存在ID。为面向用户的场景暴露和使用类似slug的东西要好得多。

但是,无论如何,你真正想做的事情是不可能的。 id通常设置为标识列,并为表中的每一行自动递增。即使您不依赖于自动增量并手动设置它,您仍然需要确保每个值的唯一值(即,您不能为多行重复ID 1。唯一的方法是将使用手动设置的ID和类似于讨论表的外键来创建复合键,但是真的,真的,不是一件好事。请不要#39;做到这一点。任何优秀的DBA不仅会因为使用外键作为另一个表的复合键的一部分而砸你,而且每次你​​有一个 ton 手动工作想要保存新信息。

我最好的建议是不要担心身份证。如果你想要一个连续的数字,你可以创建另一个属性,就像你已经拥有的MessageNumber属性一样,只要它不是表的键或索引就可以放入你想要的任何东西。这意味着您无法(或至少不应该)使用该字段实际检索任何内容。如前所述,您仍然需要按实际的行ID或类似slug的内容进行查找。

答案 1 :(得分:0)

我不确定你为什么要做你想做的事情,但如果你的Message实现是一个List,那么你可以使用一个索引并添加一个索引。索引本质上是连续的数字。你会这样做的:

int index = Messages.FindIndex(message => message.MessageID = theID);

如果你想要一些更灵活的东西:

Messages.Select((m, index) => new { index, Message = m })
        .Single(message => message.MessageID == theID);