我有基础模型User
和另外两个模型UserCreateModel
和UserEditModel
。 UserCreateModel
工作正常并且用户已创建,但当我尝试编辑用户时,它会给我错误。
我不明白为什么他在日期时间上行动,因为它在数据库中已经有了有效的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; }
}
答案 0 :(得分:7)
在将实体映射到数据库时,您需要告诉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; }
}
小心;根据您配置实体框架的方式,您可以删除现有数据库并重新创建以考虑更改。
有关详细信息,请参阅以下博文:
答案 1 :(得分:1)
通过设置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();
但它要求编辑模型中的属性与实体属性具有相同的名称(并且编辑模型不是从实体派生的)。