C# 实体框架保存更改错误

C# 实体框架保存更改错误,c#,asp.net,entity-framework,entity-framework-6,C#,Asp.net,Entity Framework,Entity Framework 6,我不确定这是否是一个bug,但在我看来很像。我首先使用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

我不确定这是否是一个bug,但在我看来很像。我首先使用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();
你知道这是一个已知的bug还是我做错了什么吗


谢谢

在使用实体框架时,我从未显式设置状态。如果删除行db.Entry\u user.State=System.Data.Entity.EntityState.Modified;您的代码仍能工作并将数据保存到数据库中吗?

您已将实体配置为具有独立关联的用户上有CountryId属性和必需属性,这意味着Country属性需要有一个值

此代码不会加载国家/地区,因为它加载了延迟加载

User _user = db.Users.Find(Id);
除非你做类似的事情

var country = _user.Country; // this will load the Country
或者,您可以使用即时加载将国家/地区与主查询一起加载

User _user = db.Users.Include(x => x.Country).FirstOrDefault(x => x.Id == Id);
小贴士:

不需要使用EntityState.Modified的_用户进行标记,因为它是一个代理,更改跟踪器将知道是否要修改该实体。
对为了解决这个问题,我添加了这一行。如果我删除它,我将保持相同的行为。或者你可以简单地完全禁用延迟加载。dbContext.Configuration.LazyLoadingEnabled=false;谢谢这确实解释并解决了这个问题。@LazyTarget,不,关键是,国家必须有一个值,要么是惰性加载,要么是急切加载,要么是用id手动设置并将其附加到context@LazyTarget,禁用延迟加载不会自动加载所有导航属性,它仍然需要与Include一起明确提到,没有它,急切加载就不会发生happen@YuliamChandra哦,我想是的。那么,房产发生了什么变化?