此问题与this question相关。
我需要能够在签名实体通过 SaveChanges 提供之前搜索签名。
这是一个搜索功能,如果没有找到则添加签名:
public static async Task<int?> TryUpdateSignature(MyDbContext db, Signature oldSignUser, Date? newDate, string userName)
{
int? SignatureID = null; //Returns null if no date
//Validate if there is a new date
if ((IsNothing(oldSignUser) && newDate != null) || (oldSignUser != null && oldSignUser.DateSign != newDate))
{
Signature recSignature = Await db.Signature.FirstOrDefaultAsync(s => s.UserID == userName && s.DateSign == newDate);
if (IsNothing(recSignature))
{
recSignature = new Signature;
recSignature.UserID = userName;
recSignature.DateSign = newDate;
db.Signature.Add(recSignature);
}
SignatureID = recSignature.SignatureID;
}
else if (oldSignUser != null && newDate != null)
{ //If no change, keep old signature
SignatureID = oldSignUser.SignatureID;
}
return SignatureID;
}
在同一个编辑帖子中多次调用时会出现问题。第一次,它会创建新的签名并返回新ID。但是第二次,它应该找到第一个签名并返回其ID,而是创建一个新的签名,因为第一个只在内存中。
我知道查找功能可以查看内存的速度,但它需要ID,所以没有运气。
一个肮脏的解决方案是在每次添加后调用 SaveChanges ,但我不愿意。
任何意见都会受到赞赏。
答案 0 :(得分:0)
我相信这个场景,因为它是相同的DbContext,你可以先去DbSet的Local尝试找到一个匹配的实体,然后再做FirstOrDefault,然后转到DB。
Signature recSignature = db.Signature.Local.FirstOrDefault(s => s.UserID == userName && s.DateSign == newDate);
if (IsNothing(recSignature))
{
recSignature = Await db.Signature.FirstOrDefaultAsync(s => s.UserID == userName && s.DateSign == newDate);
}
if (IsNothing(recSignature))
{
// ...
}