异步方法和实体框架

时间:2019-07-11 01:16:35

标签: .net entity-framework api asynchronous

社区。感谢您阅读我的文章。 我在使用.NET中的api时遇到一些问题。 这个API有3个服务。 “ PushNotifications”,“注册”,“ PushNotificationRegistration

  • PushNotifications:此服务,请避免向我之前发送的所有设备发送推送消息。
  • 注册:这是新注册服务。
  • 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)

所有方法都是Asyncronus。我有两个问题:

1) 找到订阅时,我获得了订阅和应用程序的完整数据,但有时设备数据无法恢复。我刚刚在解决此问题的查询中添加了“加入”,但有时无法恢复设备数据。我添加了(if)以恢复设备数据(如果为空)则可以在短时间内修复

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) 并非每次都这样,但是有时候,我得到了一个无法控制它的异常。所有方法都是异步的,并且上下文调用方带有Await。

  

System.NotSupportedException:在先前的异步操作完成之前,第二个操作在此上下文上启动。使用“ await”来确保在此上下文上调用另一个方法之前,所有异步操作都已完成。不保证任何实例成员都是线程安全的。 zh_cn System.Data.Entity.Internal.ThrowingMonitor.EnsureNotEntered()zh_cn 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 cancelledToken)en System.Data .Entity.Infrastructure.IDbAsyncEnumerableExtensions.ToListAsync [T](IDbAsyncEnumerable`1源)zh_cn PushNotification_NewProject.Controllers.PushNotificationController.d__8.MoveNext()zh_cn:######### \ Controllers \ PushNotificationController.cs:lneanea 760

1 个答案:

答案 0 :(得分:0)

当您在代码中调用Register或PushNotificationRegistration函数时,检查是否正在使用await。

或者在使用这两个函数的地方给出c#代码。