【问题标题】:Entity Framework SaveChanges bug实体框架 SaveChanges 错误
【发布时间】:2014-09-19 05:49:58
【问题描述】:

我不确定这是否是一个错误,但在我看来。我首先使用的是 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”属性。验证错误是:Country 字段是必需的。"}

关键是,如果我与属性 _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();

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

    您已经为实体配置了独立关联(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);
    

    提示:

    • _userEntityState.Modified 标记不是必需的,因为它是一个代理,更改跟踪器会知道实体是否会被修改。

    【讨论】:

    • 或者您可以完全禁用延迟加载。 dbContext.Configuration.LazyLoadingEnabled = false;
    • 谢谢!!这确实解释并解决了问题。
    • @LazyTarget,不,重点是,Country 必须有一个值,要么延迟加载,要么急切加载,要么手动设置 id 并将其附加到上下文中
    • @LazyTarget,禁用延迟加载不会自动加载所有带有预加载的导航属性,仍然需要在Include中明确提及,没有它,预加载不会发生
    • @YuliamChandra 哦,我是这么认为的。那么属性会发生什么变化?
    【解决方案2】:

    我在使用实体框架时从未明确设置过状态。如果删除db.Entry(_user).State = System.Data.Entity.EntityState.Modified; 行,您的代码是否仍然可以工作并将数据保存到数据库中?

    【讨论】:

    • 是的!我添加了这条线试图解决这个问题。如果我删除它,我将继续有相同的行为。
    猜你喜欢
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多