【问题标题】:Context.saveChanges() modifies foreign key that has already been setContext.saveChanges() 修改已经设置好的外键
【发布时间】:2015-06-23 00:30:55
【问题描述】:

我有两个实体:

public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
}

和

public class VideoModel
{
    public int Id { get; set; }
    public string VideoFileName { get; set; }
    public DateTime UploadedTime { get; set; }
    public virtual UserProfile Owner { get; set; }
}

当我试图坚持VideoModel 实体时,问题出现了:

     VideoModel video = db.VideoModels.Create();
            video.VideoFileName = fileName;
            video.Owner = usersContext.UserProfiles.Find(WebSecurity.CurrentUserId); // CurrentUserId = 3, ok
            video.UploadedTime = DateTime.Now; // video.Owner.UserId = 3
            db.VideoModels.Add(video); // still 3 
            db.SaveChanges(); // Problem! video.Owner.UserId = 10

并且通过 SaveChanges() 方法分配给UserId 的新值大于之前在 1 上尝试分配的值。当然,外键约束被破坏了。为什么该方法的行为如此奇怪?

【问题讨论】:

    标签: asp.net-mvc-4 entity-framework-5 foreign-key-relationship savechanges


    【解决方案1】:

    如果 EntityFramework 找到了您要求它搜索的 UserProfile,那么您所期望的行为就是它的行为方式。

    相反,目前可能发生的是 EntityFramework 无法找到您通过 usersContext.UserProfiles.Find(...); 询问的 UserProfile;而是返回 null。然后它在创建 VideoModel 时创建一个新的 UserProfile 以保持引用完整性。由于对 Username 没有要求(例如长度至少应为 8 个字符或更多),因此它能够创建一个新用户而不会在任何地方抛出任何异常。

    为了验证这一理论,请在创建新 VideoModel 后立即查询数据库中的 UserProfile 表。我很确定正在创建一个新的 UserProfile。如果正在创建一个,请告诉我你发现了什么。

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 1970-01-01
      • 2017-11-25
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      相关资源
      最近更新 更多