Идентификационные данные datetime? поле не допускает пустое значение - PullRequest
0 голосов
/ 11 января 2019

Я расширил IdentityUser с помощью класса ApplicationUser с несколькими настраиваемыми полями, чтобы соответствовать таблице AspNetUsers, которую я имею в БД SQL Server. Несколько из них определены в SQL как, например: MyDate datetime2 null. В моем классе ApplicationUser это будет: datetime? MyDate;.

Теперь единственный способ установить нулевое значение - использовать команду T-SQL, отдельную от Entity Framework, и, если она пуста, мое приложение выдает исключение, считывающее его из БД.

Я признаю, что он был ошибочно объявлен как datetime MyDate в ApplicationUser некоторое время, прежде чем я обновил его, чтобы он соответствовал БД. Это причина проблем, которые я вижу? Если да, то как мне получить ApplicationUser в соответствии с текущей схемой БД?

Вот исключение:

01/10/19 17:14:47.034 ERROR 114 MyApp.Global - Exception occurred: 
System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Data.ConstraintException: The 'MyDateUtc' property on 'ApplicationUser' could not be set to a 'null' value. You must set this property to a non-null value of type 'System.DateTime'. 
   at 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)
   at lambda_method(Closure , Shaper )
   at System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
   at System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.<MoveNextAsync>d__4.MoveNext()

Вот класс ApplicationUser (немного урезанный) и вспомогательные классы:

public class ApplicationUser : IdentityUser<long, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
    public override long Id
    {
        get { return base.Id; }
        set { base.Id = value; }
    }

    public DateTime? MyDateUtc { get; set; }

    public ClaimsIdentity GenerateUserIdentity(UserManager<ApplicationUser, long> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = manager.CreateIdentity(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }

    public Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
    {
        return Task.FromResult(GenerateUserIdentity(manager));
    }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, CustomRole, long, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    public ApplicationDbContext() : base("MyDbConnection")
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

public class CustomUserRole : IdentityUserRole<long> { }
public class CustomUserClaim : IdentityUserClaim<long> { }
public class CustomUserLogin : IdentityUserLogin<long> { }

public class CustomRole : IdentityRole<long, CustomUserRole>
{
    public CustomRole() { }
    public CustomRole(string name) { Name = name; }
}

public class CustomUserStore : UserStore<ApplicationUser, CustomRole, long, CustomUserLogin, CustomUserRole, CustomUserClaim>
{
    public CustomUserStore(ApplicationDbContext context) : base(context)
    {
    }
}

public class CustomRoleStore : RoleStore<CustomRole, long, CustomUserRole>
{
    public CustomRoleStore(ApplicationDbContext context) : base(context)
    {
    }
}

1 Ответ

0 голосов
/ 11 января 2019

DateTime представляет собой Struct и, как таковой, представляет собой тип значения . Это означает, что нельзя установить на null.

Вы можете решить свою проблему с помощью обнуляемого оператора. Использование знака вопроса (?) После типа или использование общего стиля Nullable .

Nullable <DateTime> MyDateUtc;

или

DateTime? MyDateUtc;

Вы должны проверить свой класс DbContext на тот случай, если свойство вашего класса установлено в соответствии с требованиями. Подробнее здесь

...