C#数据更新保存需要注意的一个问题

一条数据Model更新之前肯定先要取出,然后改为Poco传到前端进行修改,修改后传回来转为Model进行保存,问题在于,转为的Model不能是new出来的,否则Context跟踪会出现错误,就像以下的做法是错误的:

namespace MyApp.Models
{
    public class AppUser
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }
}

namespace MyApp.Pocos
{
    using MyApp.Models;
    public class EditUser
    {
        public EditUser(AppUser appUser)//数据库提取Model后改为Poco传到前端进行修改
        {
            Id = appUser.Id;
            Name = appUser.Name;
        }
        public string Id { get; set; }
        public string Name { get; set; }

        public AppUser GetAppUser() //修改后用这个new出来的Model进行保存,会引发错误!
        {
            return new AppUser
            {
                Id = Id,
                Name = Name,
            };
        }
    }
}

因为AppUser的Id是主键,不可修改,否则就是新数据,不能有主键等于什么的语句出现,即其中的“Id = Id”赋值语句不应出现,而不是通常以为的给用户修改的也只是Name,Id的值用户也看不到,不可能改变,没有修改。

所以正确的做法是:要么直接传Model到前端进行修改,然后进行保存,因为这里不会出现Id的赋值语句;要么Poco传回来后,先要用Poco的Id值来重新从数据库获取Model,然后传递新值进行保存,就像这样:

public async Task<IdentityResult> UpdateAppUserAsync(EditUser editUser)
{
    //不能这样
    // var user = editUser.GetAppUser();这是用于AddAppUserAsync(EditUser editUser)的添加新数据的

    var user = _context.AppUsers.FirstOrDefault(u => u.Id == editUser.Id);//重新获取Model数据
    if (user == null)
    {
        return IdentityResult.Failed(new IdentityError { Code = "UserNotFound", Description = "该用户数据库中未找到,可能已被删除!" });
    }
    if (user.Name != editUser.Name)
    {
        user.Name = editUser.Name;
        _context.Entry(user).State = EntityState.Modified;
        try
        {
            await _context.SaveChangesAsync();
            return IdentityResult.Success;
        }
        catch (DbUpdateException e)
        {
            return IdentityResult.Failed(new IdentityError { Code = "UpdateAppUserErr", Description = "保存发生错误!" + e.Message });
        }
    }
    return IdentityResult.Failed(new IdentityError { Code = "NotEdit", Description = "用户未作修改!" });
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落单枫叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值