实体框架添加性能随着行数的增加而降低



在这篇文章的开头,我要说明一下,我对。net世界是一个全新的人。ASP, EntityFramework, Linq等等,在这一点上几乎都是未知的魔法。

话虽如此,我已经用SignalR为自己构建了一个简洁的Web API聊天应用程序,支持实时事件。它工作得很好,但我有一些性能问题与添加函数。

在我的聊天应用程序中,有"pad"(聊天室),其中包含许多"Mates"one_answers"Messages"。这是我的Pad模型供参考:

public class Pad
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid PadId { get; set; }
    public string StreetAddress { get; set; }
    public int ZipCode { get; set; }
    public virtual ICollection<Mate> Mates { get; set; }
    public virtual ICollection<Message> Messages { get; set; }
}

我的问题在于我的SignalR集线器,它处理发送到特定pad的新消息。这两行大约需要半秒的时间来处理。

pad.Messages.Add(msg); // pad is the Pad entity already fetched from the db context
db.Messages.Add(msg);

但是只有当Pad。Messages包含大量的消息。成千上万的人。如果我向pad发送很少或没有消息,它几乎立即执行。

我在这里提高感知性能的最初"技巧"是在

之后将添加函数移动到,我将通知发送回客户端,但我意识到这样做可能会在以后当一个pad中有数万或数十万条消息时出现潜在问题。

任何建议将不胜感激!

下面是整个消息发送方法供参考:

public void SendMessage(string pad_id, string body)
{
    var user_id = IdentityExtensions.GetUserId(Context.User.Identity);
    body = body.Trim();
    if (body.Length <= 0)
    {
        return;
    }
    // Check that the user belongs in this pad...
    var user = (from u in db.Users
                where u.Id == user_id
                select u).First();
    var pad = (from p in user.Pads where p.PadId == new Guid(pad_id) select p).FirstOrDefault();
    if (pad != null) {
        // Save the message to the database
        var msg = new Message()
        {
            MessageId = new Guid(),
            Author = user,
            Body = body,
            SendTime = DateTimeOffset.UtcNow,
            Pad = pad
        };
        pad.Messages.Add(msg); // These two lines
        db.Messages.Add(msg); // Are the culprit.
        db.SaveChangesAsync();
        Clients.Group(pad_id).messageReceived(user.Id, pad_id, body, DateTimeOffset.UtcNow); // Send message to clients
    }
}

EDIT:我在EF 6.0.0

在您的代码中,您要做的就是向表中添加1行(Message)。

在构造Message实体时,只使用Pad对象而不是Pad对象。这样就不需要处理所有的pad对象。从DB的角度来看,您只需要添加一个带有PadId键的Message行。

    var msg = new Message()
    {
        MessageId = new Guid(),
        Author = user,
        Body = body,
        SendTime = DateTimeOffset.UtcNow,
        PadId = new Guid(pad_id)
    };
    // pad.Messages.Add(msg); // don't need this.
    db.Messages.Add(msg);

上面应该总是插入一行,而不依赖于pad中的消息数量。如果它仍然会带来性能问题,那么添加单行会导致对表进行大量索引更新。

相关内容

  • 没有找到相关文章

最新更新