在这篇文章的开头,我要说明一下,我对。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包含大量的消息。成千上万的人。如果我向pad发送很少或没有消息,它几乎立即执行。 我在这里提高感知性能的最初"技巧"是在pad.Messages.Add(msg); // pad is the Pad entity already fetched from the db context
db.Messages.Add(msg);
任何建议将不胜感激!
下面是整个消息发送方法供参考:
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中的消息数量。如果它仍然会带来性能问题,那么添加单行会导致对表进行大量索引更新。