EntityFramework代码优先的DateTime列不能按预期工作

Sta*_*tan 2 c# entity-framework

我有基础模型User和两个额外的模型UserCreateModelUserEditModel.UserCreateModel工作得很好并且创建了用户,但是当我尝试编辑用户时它会给我错误.

我不明白他为什么在datetime上行动,因为它在数据库中已经有了有效的DateTime属性.我想做的就是更新Name属性.我在这做错了什么?

错误

将datetime2数据类型转换为日期时间数据类型会导致超出范围的值.该语句已终止.

调节器

public HttpResponseMessage PutUser(int id, UserEditModel user)
{
    if (!ModelState.IsValid)
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }

    if (id != user.Id)
    {
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }

    db.Entry(user).State = EntityState.Modified;

    try
    {
        db.SaveChanges(); // Exception here, all validation passed with success
    }
    catch (DbUpdateConcurrencyException ex)
    {
        return Request.CreateErrorResponse(HttpStatusCode.NotFound, ex);
    }

    return Request.CreateResponse(HttpStatusCode.OK);
}
Run Code Online (Sandbox Code Playgroud)

模型

public class User
{
    public int Id { get; set; }
    public virtual DateTime CreatedDateTime { get; set; }
    public virtual string Username { get; set; }
    public virtual string Password { get; set; }
    public virtual string PasswordSalt { get; set; }
    public virtual string AccessToken { get; set; }
    public virtual string Name { get; set; }
}

public class UserEditModel : User
{
    [Required]
    public override string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*ale 7

在将实体映射到数据库时,需要告诉Entity Framework使用正确的列类型.

如果您使用的是流畅的API,您可以这样做:

Property(p => p.CreatedDateTime).HasColumnType("datetime2");
Run Code Online (Sandbox Code Playgroud)

或者如果您希望直接在POCO上使用column属性:

public class User
{   
    public int Id { get; set; }

    [Column(TypeName = "DateTime2")]
    public virtual DateTime CreatedDateTime { get; set; }

    public virtual string Username { get; set; }
    public virtual string Password { get; set; }
    public virtual string PasswordSalt { get; set; }
    public virtual string AccessToken { get; set; }
    public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

小心; 根据您配置实体框架的方式,可以删除现有数据库并重新创建以考虑更改.

有关详细信息,请参阅以下博文: