У меня есть следующая модель
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
! Спасибо за любую помощь!