асинхронные методы и Entity Framework - PullRequest
0 голосов
/ 11 июля 2019

Community.Спасибо, что прочитали мой пост.Я с некоторыми проблемами с API в .Net.У этого API есть 3 Сервиса."PushNotifications", "Register", "PushNotificationRegistration

  • PushNotifications: эта служба, не позволяйте мне отправлять Push на все устройства. Предыдущий регистр.
  • Регистрация: это новая служба регистрации.
  • PushNotificationRegistration: Это старая служба Старого API. Она здесь для сосуществования, в то время как другие приложения не обновлены.

Diagrama Estructura

Классы:

public class Subscription
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public string ClientId { get; set; }
    [StringLength(1000)]
    public string Token { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime LastUpdateDate { get; set; }
    public bool IsDeleted { get; set; }
    [Index("IX_Device_App", 2, IsUnique = true)]
    [ForeignKey("device")]
    public string DeviceId { get; set; }
    public virtual Device device { get; set; }
    [Index("IX_Device_App", 1, IsUnique = true)]
    [ForeignKey("app")]
    public int AppId { get; set; }
    public virtual App app { get; set; }
}

public class App
{
    public App()
    {
        this.Subscriptions = new HashSet<Subscription>();
    }
    [Key]
    public int AppId { get; set; }
    public string Name { get; set; }
    [JsonIgnore]
    public virtual ICollection<Subscription> Subscriptions { get; set; }
}
public class Device
{
    public Device()
    {
        this.Subscriptions = new HashSet<Subscription>();
    }
    /// <summary>
    /// De esta forma utilizo una Key String
    /// </summary>
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    [Index(IsUnique = true)]
    [Column(TypeName = "nvarchar")]
    [StringLength(200)]
    public string DeviceId { get; set; }
    public string Name { get; set; }
    public bool IsDeleted { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime LastUpdateDate { get; set; }
    [JsonIgnore]
    public virtual ICollection<Subscription> Subscriptions { get; set; }
}

Методы Знак

public async  Task<Crosslayer.GenericReturnValue> Register(Crosslayer.Entities.Dtos.SubscriptionDto request)
public  async Task<Crosslayer.GenericReturnValue> PushNotificationRegistration(Crosslayer.Entities.Olds.Subscriptions subscription)

Все методы асинхронные. У меня две проблемы:

1) В момент нахождения подписки я получил полные данные подписки и приложения, но иногда данные устройства не восстанавливались. Я просто добавил присоединение к запросу для решения этой проблемы, но иногда данные устройстваЯ не могу восстановить. Я добавляю (если) для восстановления данных устройства, если в течение короткого времени необходимо установить значение Null

Subscription DbSubscription = await (from s in context.Subscriptions
                                           join app in context.App on s.AppId equals app.AppId
                                           join dev in context.Device on s.DeviceId equals dev.DeviceId
                                           where s.DeviceId == subscription.device.DeviceId &&
                                           s.AppId == subscription.app.AppId
                                           select s).FirstOrDefaultAsync();
 foreach (var item in aux)
                    {
                        ///If for Fix Device return Null
                        if (item.device == null)
                        {
                            item.device = await (from d in context.Device
                                                 where d.DeviceId == item.DeviceId
                                                 select d).FirstOrDefaultAsync();
                        }

2) Не каждый раз, но иногда я получаюИсключение невозможно контролировать. Все методы какynchronous и Context Caller с Await.

System.NotSupportedException: вторая операция, запущенная в этом контексте перед завершением предыдущей асинхронной операции.Используйте 'await', чтобы убедиться, что все асинхронные операции завершены, прежде чем вызывать другой метод в этом контексте.Любые члены экземпляра не гарантированно являются потокобезопасными.ru System.Data.Entity.Internal.ThrowingMonitor.EnsureNotEntered () ru System.Data.Entity.Core.Objects.ObjectQuery 1.System.Data.Entity.Infrastructure.IDbAsyncEnumerable<T>.GetAsyncEnumerator() en System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions.ForEachAsync[T](IDbAsyncEnumerable 1 источник, действие 1 action, CancellationToken cancellationToken) en System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions.ToListAsync[T](IDbAsyncEnumerable 1 источник, CancellationToken cancellationToken) en System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions.ToListAsync [T] (источник IDbAsyncEnumerable`1) en PushNotification_NewProject.Controllers.PushNotificationController.d__8.MoveNext () en C: ######### \ Controllers \ PushNoa 71041 *

1 Ответ

0 голосов
/ 11 июля 2019

Проверьте, используете ли вы ожидание при вызове функций Register или PushNotificationRegistration в вашем коде.

Или укажите код c #, где вы используете эти две функции.

...