EF 当删除表数据,但是其他表有外键关联时,但又不想删除关联表的数据时,将外键关联表的主键更新为null
以用户信息和角色两张关联表的代码示例
/// <summary>
/// 用户信息表
/// </summary>
public class UserInfo
{
/// <summary>
/// 主键ID
/// </summary>
[Key]
public string ID {get;set}
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 登录名
/// </summary>
public string LoginAccount { get; set; }
/// <summary>
/// 登录密码
/// </summary>
public string LoginPassword { get; set; }
/// <summary>
/// 联系电话
/// </summary>
public string Tel { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public string Email { get; set; }
/// <summary>
/// 性别 0:男 1:女
/// </summary>
public string Sex { get; set; }
/// <summary>
/// 是否可用 0 否 1:是 默认可用
/// </summary>
public int IsEnable { get; set; } = 1;
/// <summary>
/// 是否管理员 0:否 1:是 默认否
/// </summary>
public int IsAdmin { get; set; }
/// <summary>
/// 角色
/// </summary>
public virtual RoleInfo RoleInfo { get; set; }
/// <summary>
/// 角色信息
/// </summary>
public class RoleInfo
{
/// <summary>
/// 主键ID
/// </summary>
[Key]
public string ID { get; set; }
/// <summary>
/// 角色名称
/// </summary>
public string RoleName { get; set; }
/// <summary>
/// 角色描述
/// </summary>
public string RoleDescribe { get; set; }
}
删除角色表时,如果用户表有外键关联,又不想删除用户表信息,可操作将用户表中关联的角色id更新为null
更新外键为null代码
DbContext db=new DbContext();
db.Entry(userInfo).State = EntityState.Modified;
db.Entry(userInfo).Reference("RoleInfo").Load();
userInfo.RoleInfo=null;
db.SaveChanges();
通用方法
/// <summary>
/// 删除外键关联
/// </summary>
/// <param name="entity"></param>
/// <param name="include">关联表</param>
/// <returns></returns>
public bool DeleteLinkEntity(T entity,string include)
{
try
{
netCoreDbContext.Entry(entity).State = EntityState.Modified;
netCoreDbContext.Entry(entity).Reference(include).Load();
Type entityType = typeof(T);
PropertyInfo[] properties = entityType.GetProperties();
foreach (var p in properties)
{
if (p.Name.Equals(include))
{
p.SetValue(entity, null);
break;
}
}
int rowsAffected = netCoreDbContext.SaveChanges();
return rowsAffected > 0 ? true : false;
}
catch (Exception ex)
{
LogHelper.WriteErrLog(logPath, ex);
return false;
}
}