Code First默认DateTime不起作用

时间:2012-11-18 11:59:42

标签: c# entity-framework code-first

我有一个DateTime字段,只要在该表中输入记录(我基本上是一个DateCreated字段),我想将其设置为默认值。这是我的代码

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

为什么当我尝试使用上面的代码添加用户时为什么会出现错误'无法将值NULL插入列'DateCreated',表'Main.Users'; 列不允许空值。 INSERT失败。'?

2 个答案:

答案 0 :(得分:4)

使用“HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)”选项,您说您希望它成为自动增加的列。这不是你想要的。你想要Computed,它表示数值由数据库自动填充,而不是由你自己填充。

只是更改此选项并不能解决您的问题。通过将其设置为Computed,您说您不希望它采用您自己的值,因此在构造函数中设置它是没有意义的。您必须在数据库级别将默认值设置为“GETDATE()”。使用迁移时,请将该字符串添加到defaultValueSql参数。

答案 1 :(得分:-1)

通过运行Add-Migration 20170303_example生成迁移后,转到20170303_example文件,然后转到

查找DateTime列,例如:

CreatedDate = c.DateTime(nullable: false)

并将其更新为:

CreatedDate = c.DateTime(defaultValueSql: "GETDATE()") 

最后在Package Manager控制台中运行Update-Database命令以更新数据库。