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.'?
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.