c# – EF代码优先 – 无法更新数据库行
发布时间:2020-12-16 01:39:02 所属栏目:百科 来源:网络整理
导读:用EF“代码优先”方法尝试了一些代码并遇到了一个奇怪的问题. 我的datacontext: public class BookmarkerDataContext : DbContext { public DbSetUser Users { get; set; } protected override void OnModelCreating(System.Data.Entity.ModelConfiguration
用EF“代码优先”方法尝试了一些代码并遇到了一个奇怪的问题.
我的datacontext: public class BookmarkerDataContext : DbContext { public DbSet<User> Users { get; set; } protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) { modelBuilder.Entity<User>().HasKey(u => u.UserId); base.OnModelCreating(modelBuilder); } } 用户对象的位置是: public class User { public long UserId { get; set; } public ICollection<Tag> Tags { get; set; } } 在我的代码中,我做了一件相当简单的事情: public void UpdateUserTags(User user,ICollection<Tag> taglist) { user.Tags = new List<Tag>(user.Tags.Union(taglist)); datacontext.Users.Add(user); datacontext.SaveChanges(); } 我传递给这个函数的用户对象是这样的结果: datacontext.Users.SingleOrDefault(u => u.UserId==id) 每次我调用UpdateUserTags函数时,它似乎在User表中创建一个新的Row而不是更新它.我在这里做错了吗? 解决方法
@Donald是正确的,你需要在进行更新时附加到ObjectContext.
但是,仅当您的实体已分离时才会这样. 如果您已经从图表中检索到单个实体, var user = datacontext.Users.SingleOrDefault(u => u.UserId==id); 这意味着您不需要附加或再次获取它.这样做: var user = datacontext.Users.SingleOrDefault(u => u.UserId==id); user.Tags = new List<Tag>(user.Tags.Union(taglist)); context.SaveChanges(); 但是,我不建议替换整个Tags集合,添加标签: user.Tags.Add(someTag); HTH (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |