突然从实体框架中获取异常

Posted

技术标签:

【中文标题】突然从实体框架中获取异常【英文标题】:Getting exception suddenly from entityframework 【发布时间】:2018-04-15 00:50:00 【问题描述】:

我不时收到此异常:

“用户”上的“电子邮件”属性无法设置为“System.Int64”值。您必须将此属性设置为“System.String”类型的非空值。方法消息:,LogException:System.InvalidOperationException:“用户”上的“电子邮件”属性无法设置为“System.Int64”值。您必须将此属性设置为“System.String”类型的非空值。 在 System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader1.GetValue(DbDataReader reader, Int32 ordinal) at lambda_method(Closure , Shaper ) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func2 构造EntityDelegate,EntityKey entityKey,EntitySet entitySet) 在 lambda_method(闭包,Shaper) 在 System.Data.Entity.Core.Common.Internal.Materialization.Coordinator1.ReadNextElement(Shaper shaper) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper1.SimpleEnumerator.MoveNext() 在 System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 源) 在 Project.Services.UserService.FindById(Int64 userId)

我在 MVC 项目中使用 Asp.net Identity。

我的用户类如:

public class User : IdentityUser<long, IdentityConfig.UserLogin, IdentityConfig.UserRole, IdentityConfig.UserClaim>

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(IdentityConfig.CustomUserManager manager)
    
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

        // Add custom user claims here
        return userIdentity;
    

    [MaxLength(256)]
    [Index(IsUnique = true)]
    [Required]
    public override string Email  get; set; 

    [Required]
    [MaxLength(256)]
    public string FirstName  get; set; 

      // rest of properties
    ....

用户管理器:

public class CustomUserManager : UserManager<User, long>
    
        public CustomUserManager(IUserStore<User, long> store, IdentityFactoryOptions<CustomUserManager> options) : base(store)
        
            this.UserValidator = new UserValidator<User, long>(this)
            
                AllowOnlyAlphanumericUserNames = false,
                RequireUniqueEmail = true
            ;

            // Configure validation logic for passwords
            PasswordValidator = new PasswordValidator
            
                RequiredLength = 8,
                RequireLowercase = true,
                RequireUppercase = true,
                RequireDigit = true
            ;

            // Configure user lockout defaults
            UserLockoutEnabledByDefault = true;
            DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);
            MaxFailedAccessAttemptsBeforeLockout = 5;

            // Register two factor authentication providers. This application uses Phone and Emails as a step of receiving a code for verifying the user
            // You can write your own provider and plug it in here.
            RegisterTwoFactorProvider("Google Authentication", new GoogleAuthenticatorTokenProvider());

            var provider = new MachineKeyProtectionProvider();
            UserTokenProvider = new DataProtectorTokenProvider<User,long>(provider.Create("ResetPasswordPurpose"));

        
    

用户服务:

public class UserService : EntityService<User>, IUserService
   
    private readonly IdentityConfig.CustomUserManager _userManager;

    public UserService(MyDbContext context, IdentityConfig.CustomUserManager userManager) : base(context)
    
        _userManager = userManager;
    

   public User FindById(long userId)
    
        return _userManager.Users.FirstOrDefault(x => x.Id == userId);
    

// other methods..

注册 Autofac:

        builder.RegisterModule(new ServiceModule());
        builder.RegisterModule(new EfModule());

        builder.RegisterType<IdentityConfig.RoleStore>().As<IRoleStore<IdentityConfig.Role, long>>().InstancePerRequest();
        builder.RegisterType<IdentityConfig.CustomUserStore>().As<IUserStore<User, long>>().InstancePerRequest();
        builder.RegisterType<IdentityConfig.CustomUserManager>().AsSelf().InstancePerRequest();
        builder.RegisterType<IdentityConfig.CustomSignInManager>().AsSelf().InstancePerRequest();
        builder.RegisterType<IdentityConfig.CustomRoleManager>().AsSelf().InstancePerRequest();

        builder.Register<IAuthenticationManager>(c => HttpContext.Current.GetOwinContext().Authentication);


        builder.Register(c => new IdentityFactoryOptions<IdentityConfig.CustomUserManager>
        
            DataProtectionProvider = new DpapiDataProtectionProvider("MyWebAppName"),
            Provider = new IdentityFactoryProvider<IdentityConfig.CustomUserManager>()
        ).InstancePerRequest();



public class ServiceModule : Module

    protected override void Load(ContainerBuilder builder)
    
        builder.RegisterAssemblyTypes(Assembly.Load("Project.Services"))

                 .Where(t => t.Name.EndsWith("Service") || t.Name.EndsWith("Validator"))
                 .AsImplementedInterfaces()
                 .InstancePerLifetimeScope();
    



 public class EfModule : Module

    protected override void Load(ContainerBuilder builder)
    
        builder.RegisterType(typeof(MyDbContext)).AsSelf().WithParameter("connectionString", ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString).InstancePerRequest();
    

我还注意到这个错误不仅会影响用户,还会影响其他一些实体!

问题是应用程序运行了一段时间,然后给出了太多这种错误,这对我来说没有任何意义,让我很生气。

我正在使用 Azure SQL、Azure Web 服务、Autofac。

【问题讨论】:

可能是你的 cookie 在某个时候变成了垃圾,或者你有一个线程问题,它同时读取和写入 cookie 我没有看到任何异常处理......并且您正在使用异步/等待。您希望该方法做什么,异常会在哪里引发? @DanEsparza 我发布了整个异常 应用程序运行一段时间时出现的问题通常与 EF 上下文实例存在时间过长并在多个线程(请求)中使用有关。那么,您的应用中的常规上下文生命周期是什么? @GertArnold 我更新了我的代码,我也怀疑 EF 上下文,但我尝试在 autofac 中使用不同类型的注册来注册它。 【参考方案1】:

这里也是同样的问题。它发生在中高需求时。我不知道该怎么办了。我每天回收 5 次。

我找不到任何标准。异常会引发许多不同的方法。没有标准。看起来完全随机。

似乎我正在尝试检索数据库上的信息并且它总是返回空白数据,因此当它尝试将空数据转换为模型时会引发错误。

【讨论】:

这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review 我的计划只是添加评论,但 SOF 因缺乏声誉而不允许我:(

以上是关于突然从实体框架中获取异常的主要内容,如果未能解决你的问题,请参考以下文章

获取实体框架核心 1.1 的空异常

提供者未返回 ProviderManifestToken 字符串实体框架

实体框架运行转换代码时引发异常

如何从实体框架 6 中的 Auditlog 实体获取 id

实体框架多对多异常与继承

如何强制实体框架始终从数据库中获取更新数据?