从entityframework突然获得异常

时间:2017-11-02 13:13:54

标签: asp.net-mvc entity-framework azure asp.net-identity azure-sql-database

我不时得到这个例外:

  

电子邮件'用户'用户'无法设置为System.Int64'值。您必须将此属性设置为类型为' System.String'的非null值。方法消息:,LogException:System.InvalidOperationException:' Email'用户'用户'无法设置为System.Int64'值。您必须将此属性设置为类型为' System.String'的非null值。      在System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader 1.GetValue(DbDataReader reader, Int32 ordinal) at lambda_method(Closure , Shaper ) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func 2 constructEntityDelegate,EntityKey entityKey,EntitySet entitySet)      在lambda_method(Closure,Shaper)      在System.Data.Entity.Core.Common.Internal.Materialization.Coordinator 1.ReadNextElement(Shaper shaper) at System.Data.Entity.Core.Common.Internal.Materialization.Shaper 1.SimpleEnumerator.MoveNext()      在System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable`1 source)      在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
    ....
}

UserManager:

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"));

        }
    }

UserService:

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网络服务,Autofac。

0 个答案:

没有答案