我有一个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失败。'?
答案 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
命令以更新数据库。