加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读