如何在SaveChanges之前搜索实体

时间:2018-05-22 20:35:05

标签: asp.net-mvc entity-framework

此问题与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 ,但我不愿意。

任何意见都会受到赞赏。

1 个答案:

答案 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))
{
  // ...
}