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;
}
}