我不太确定这是不是个窃听器,但在我看来很像。我首先使用实体框架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();
知道这是个已知的bug还是我做错了什么吗?
谢谢!
发布于 2014-09-18 22:18:50
您已经用独立关联(User
上有CountryId
属性)和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);
提示:
_user
标记EntityState.Modified
并不是必要的,因为它是一个代理,更改跟踪器将知道实体是否会被修改。发布于 2014-09-18 22:07:14
当我使用实体框架时,我从未明确地设置过状态。如果删除行db.Entry(_user).State = System.Data.Entity.EntityState.Modified;
,您的代码是否仍能工作并将数据保存到数据库中?
https://stackoverflow.com/questions/25927188
复制相似问题