实体框架SaveChanges错误

时间:2014-09-19 05:49:58

标签: c# asp.net entity-framework entity-framework-6

我不确定这是不是一个错误,但看起来像我。我首先使用Entity Framework 6.1.1代码,我有以下类:

public class User
{
    public int Id { get; set; }
    [Required]
    [MaxLength(20)]
    public string Username { get; set; }
    [Required]
    [MaxLength(200)]
    public string Password { get; set; }
    [Required]
    public virtual Country Country { get; set; }

}

public class Country
{
    [Key]
    public int Id { get; set; }
    [Required]
    [MaxLength(3)]
    public string CountryCode { get; set; }
    [Required]
    [MaxLength(20)]
    public string CountryName { get; set; }
}

当我尝试使用以下代码更新用户密码时,出现错误:

User _user = db.Users.Find(Id);
_user.Password = Password;
db.Entry(_user).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();

错误: 一个或多个实体的验证失败。请参阅' EntityValidationErrors'物业详情。验证错误包括:国家/地区字段是必需的。"}

重点是,如果我与属性_user.Country.Id进行任何交互,它就可以了。像这样:

User _user = db.Users.Find(Id);
_user.Password = Password;
Console.Write(_user.Country.Id.ToString());
db.Entry(_user).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();

不知道这是一个已知错误还是我做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

我在使用Entity Framework时从未明确设置过State。如果删除行db.Entry(_user).State = System.Data.Entity.EntityState.Modified;,您的代码是否仍然有效并将数据保存到数据库中?

答案 1 :(得分:0)

您已经为实体配置了独立关联(CountryId上有User属性)和Required属性,这意味着Country属性需要有一个值

此代码不会加载Country,因为它加载了延迟加载。

User _user = db.Users.Find(Id);

除非你做类似的事情。

var country = _user.Country; // this will load the Country

或者您可以使用预先加载来加载Country和主查询。

User _user = db.Users.Include(x => x.Country).FirstOrDefault(x => x.Id == Id);

提示:

  • 使用_userEntityState.Modified进行标记不是必需的,因为它是代理,更改跟踪器将知道实体是否会被修改。
相关问题