问题描述
所以我插入到我的应用权限表中,这是组、应用程序资源和权限之间的关系
如你所见,我的对象没有空值
是的,当我保存时,我得到无法将值 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;
}
}
解决方法
你有错误的算法。您不能使用相同的算法来更新和添加新项目。例如我使用这些通用方法:
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);