Search code examples
c#entity-frameworkcode-first

Code First default DateTime not working


I have a DateTime field that I want to set to a default value whenever a record is entered into that table (it is basically a DateCreated field). This is my code

public partial class User
    {
        public User()
        {
            this.DateCreated = DateTime.Now; //set default value
            Roles = new HashSet<Role>();
        }

        public ICollection<Role> Roles { get; set; } //many to many relationship

        public int UserId { get; set; }
        public string FirstName { get; set; }
        public string Surname { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
        public string City { get; set; }

        //foreign key
        public int CountryId { get; set; }
        //navigation properties
        public virtual Country Country { get; set; }

        //foreign key
        public int LanguageId { get; set; }
        //navigation properties
        public virtual Language Language { get; set; }

        public string EmailAddress { get; set; }
        public long FacebookId { get; set; }
        public DateTime DateCreated { get; set; }
    } }

    public class UserConfiguration : EntityTypeConfiguration<User>
    {
        public UserConfiguration()
        {
            ToTable("Users", schemaName: "Main");

            HasKey(s => s.UserId);

            Property(p => p.FirstName)
                .IsRequired().HasMaxLength(50); //translates to non-nullable     

            Property(p => p.Surname)
                .IsRequired().HasMaxLength(50);

            Property(p => p.Username)
                .IsRequired().HasMaxLength(20);

            Property(p => p.Password)
                .IsRequired().HasMaxLength(20);

            Property(p => p.City)
                .IsOptional().HasMaxLength(50); //not required

            Property(p => p.LanguageId)
                .IsRequired();

            Property(p => p.EmailAddress)
                .IsRequired().HasMaxLength(50);

            Property(p => p.FacebookId)
                .IsOptional();

            Property(p => p.DateCreated) 
                .IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
            //attribute ensures that DateCreated only gets saved to the database when you are adding a 
            //row, not when you are saving
        }
    }

    context.Users.Add(new User
                {
                    FirstName = "Test",
                    Surname = "User",
                    Username = "testuser72",
                    Password = "testuser72",
                    City = "London",
                    CountryId = context.Countries.Single(d => d.CountryName == "United Kingdom").CountryId,
                    LanguageId = context.Languages.Single(d => d.LanguageName == "English").LanguageId,
                    EmailAddress = "testuser@yahoo.co.uk",
                    Roles = new Role[] { context.Roles.Single(r => r.RoleName == "Content Editor"), context.Roles.Single(s => s.RoleName == "User") }
                });

Why when I try to add a user using the code above why do I get the error 'Cannot insert the value NULL into column 'DateCreated', table 'Main.Users'; column does not allow nulls. INSERT fails.'?


Solution

  • With the option "HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)" you say you want it to be an auto incremended column. This is not what you want. You want Computed, which says the value is automatically filled by the database, and not by you.

    Just changing this option does not solve your problem. By setting it to Computed, you say you don't want it to take your own values, so settig it in the constructor is pointless. You have to set a default value at the database level to "GETDATE()". When you use migrations, add the string to the defaultValueSql parameter.