3

我有一个 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';列不允许空值。插入失败。'?

4

2 回答 2

4

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

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

于 2012-11-18T13:02:03.723 回答
-1

一旦通过运行Add-Migration 20170303_examplego to 20170303_examplefile 生成迁移,然后

例如,查找 DateTime 列:

CreatedDate = c.DateTime(nullable: false)

并将其更新为:

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

最后Update-Database在包管理器控制台中运行命令来更新数据库。

于 2017-03-13T23:12:35.257 回答