EF 6.4 SqlException:无法将值 NULL 插入到列“ID”、表 PERMISSION 中;列不允许 NULLS

问题描述

所以我插入到我的应用权限表中,这是组、应用程序资源和权限之间的关系

如你所见,我的对象没有空值

是的,当我保存时,我得到无法将值 NULL 插入到列 'ID',表 PERMISSION';列不允许 NULLS

我很困惑

public TEntity Save(TEntity obj)
{
    try
    {

        lock (obj)
        {
            _context.Entry(obj).State = obj.Id == 0 ? EntityState.Added : EntityState.Modified;
            _context.SaveChanges();
            _context.Entry(obj).Reload();

        }

        return obj;


    }
    catch (sqlException ex)
    {
        //return null;
        throw ex;
    }
}

enter image description here

解决方法

你有错误的算法。您不能使用相同的算法来更新和添加新项目。例如我使用这些通用方法:

public virtual T Add(T t)
        {

            Context.Set<T>().Add(t);
            Context.SaveChanges();
            return t;
        }

public virtual T Update(T t)
        {
            if (t == null) return null;
            var exist = Context.Set<T>().Find(t);
            if (exist == null) return exist;
            Context.Entry(exist).CurrentValues.SetValues(t);
            Context.SaveChanges();

            return exist;
        }

如您所见,Context.Entry(exist) 应该用于更新,而不是添加新的。这就是您出现错误的原因。

你用 Lock 做什么?无论您喜欢与否,EF 跟踪查询。如果您想同时运行另一个任务,则必须创建一个新的数据库上下文。

,

所以我使用了另一个对象的 Permission 实体。 我们有一个包含所有 ApplicationResources 和权限的表 把它想象成一个模板表

我正在使用此权限和资源。

而不是从数据库中拉取 这引起了混乱

以下是使代码工作的更改

ap = new AppliedPermission();
                    ap.ActiveFlag = true;

                    ap.Version = ap.Version + 1;
                    ap.LastModifiedBy = currentUserId;
                    ap.CreatedBy = currentUserId;
                    ap.CreatedTimestamp = currentTime;
                    ap.ResourceId = uploaded.ResourceId;
                    ap.PermissionId = uploaded.PermissionId;
                    ap.LastModifiedByUser = this.CurrentUser;
                    ap.CreatedByUser = this.CurrentUser;
                    ***ap.LuResource = resRepo.GetById(uploaded.ResourceId);
                    ap.LuPermission = permRepo.GetById(uploaded.PermissionId);
                    ap.UpdatedTimestamp = currentTime;***

                    ap.GroupId = BO.Id;
                    ap.RapidGroup = BO;


                    applPermRepo.Save(ap);