AttachRange работает очень долго - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть следующая модель

public class PartnerPush 
{
    public int PartnerPushId { get; set; }
    public Customer Customer { get; set; }
    public int CustomerId { get; set; }
    public string PackageId { get; set; }
    public string Advertiser { get; set; }
    public string FCMResponse { get; set; }
    public bool Sent { get; set; }
    public DateTime CreatedAt { get; set; }
    public PartnerPush()
    {
        CreatedAt = DateTime.UtcNow;
    }
}

После некоторых операций я собираюсь сохранить результат (который содержит список реализаций модели) с помощью:

await _applicationDbContext.PartnerPushes.AddRangeAsync(pushes);

Это выглядитвроде бы хорошо, но EF выдает мне ошибку о том, что у меня уже есть первичный ключ для объекта Customer. Хорошо, я знаю, как решить это. Я должен отметить это как уже приложенное. Я использую это:

_applicationDbContext.Customers.AttachRange(_applicationDbContext.Customers.Where(x => pushes.Select(y => y.CustomerId).Contains(x.CustomerId)));

Обратите внимание, что у меня нет напрямую Customer сущности, у меня просто есть int CustomerId для каждой PartnerPush реализации. Поле Customer равно нулю.

Так что работает. Но AttachRange очень медленно. Для проверки у меня есть следующий код:

        var watch = System.Diagnostics.Stopwatch.StartNew();

        _applicationDbContext.Customers.AttachRange(_applicationDbContext.Customers.Where(x => pushes.Select(y => y.CustomerId).Contains(x.CustomerId)));

        watch.Stop();
        var elapsedMs = watch.ElapsedMilliseconds;

        Console.WriteLine(elapsedMs);

и он дает мне 7831! Спасибо за любую помощь!

...