簡體   English   中英

EntityFramework代碼優先的DateTime列不能按預期工作

[英]DateTime column in EntityFramework code-first does not work as expected

我有基本模型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);
}

模型

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

在將實體映射到數據庫時,需要告訴Entity Framework使用正確的列類型。

如果您使用的是流暢的API,您可以這樣做:

Property(p => p.CreatedDateTime).HasColumnType("datetime2");

或者如果您希望直接在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; }
}

小心; 根據您配置實體框架的方式,可以刪除現有數據庫並重新創建以考慮更改。

有關詳細信息,請參閱以下博文:

通過設置db.Entry(user).State = EntityState.Modified; 你告訴EF你想要更新user 所有屬性。 並且因為您的UserEditModel派生自User實體,EF將嘗試更新所有實體屬性。

我不知道為什么你從實體派生編輯模型,但它會導致你的場景出現問題。 我更願意只從Db加載用戶,更新你想要的屬性並保存它:

var dbUser = db.Users.Find(user.Id);
dbUser.Username = user.Name;
db.SaveChanges();

更一般地,您可以更新多個屬性,如下所示:

var dbUser = db.Users.Find(user.Id);
db.Entry(dbUser).CurrentValues.SetValues(user);
db.SaveChanges();

但它要求編輯模型中的屬性與實體屬性具有相同的名稱(並且編輯模型不是從實體派生的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM