c# - 如何留下孤立数据?
问题描述
使用 Visual Studio 2017、C#、Entity Framework .Net 6.2.0
我有一个设置,其中一个表 ( LOG
) 具有另一个表 () 的外键BAR
。我想删除一个条目,BAR
同时保持条目和外键不变LOG
。
public class LOG
{
[Key]
public int id { get; set; }
public string statusLog { get; set; }
public virtual BAR bar { get; set; }
}
public class BAR
{
[Key]
public int id { get; set; }
public string data { get; set; }
}
然后我尝试删除一个条目。
BAR bar1 = DBContext.BARs.Where(b => b.id == enteredID).First();
DBContext.BARs.Remove(bar1);
DB.Context.SaveChanges();
并得到这个异常
DELETE 语句与 REFERENCE 约束“FK_dbo.LOG_dbo.BARs_BAR_id”冲突。冲突发生在数据库 \"*******\"、表 "dbo.LOG"、列 'BAR_id' 中。
该语句已终止
如何在BAR
将条目保留在表格中的同时从表格中删除条目LOG
?即使在我的系统中添加和删除条目时,我也希望数据显示我的日志记录表中发生的情况。
解决方案
从纯粹的实体框架的角度来看,使用Nullable
外键
例子
public class LOG
{
[Key]
public int id { get; set; }
public string statusLog { get; set; }
public int? BarId{ get; set; }
public virtual BAR bar { get; set; }
}
需要考虑的事项:
尽管 SQL Server 支持它,但 EF 无法设置级联规则以在删除相关对象时使 FK 无效。
删除时Bar
,您需要将它们Logs
加载到内存中以使它们为空...
查看任意数量的相关问题以解决此问题
推荐阅读
- python-3.x - PL/Python3 - 连接 PLyResults
- qt - 如何使用 QT-Layouts 将我的主窗口分成 5 个区域
- reactjs - 试图从另一个组件设置状态,以便我的模式可以弹出
- cassandra - 如何将列更新为 cassandra 表中的特定值?
- r - 将数据框写入 R 中的 .txt 文件,不添加 ¬†
- multithreading - 在 JMeter 中连续并发运行一组线程组?
- r - 两个数据帧之间的 T 检验并按 R 中的相似行分组
- javascript - 如何在 RXJS Observable 中转换属性
- javascript - Checking 'validity' of expression string based on 'rules' in /
- c++ - custom allocator for stl map in c++