使用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
表中删除条目?我希望数据显示我的日志记录表中发生了什么,即使在我的系统中添加和删除条目。
答案 0 :(得分:2)
从纯粹的实体框架角度来看,使用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
加载到内存中以使其无效...
查看任意数量的相关问题,以便了解此问题
How to update FK to null when deleting optional related entity
答案 1 :(得分:0)
您应该在日志类中添加一个ID:
public class LOG
{
[Key]
public int id { get; set; }
public string statusLog { get; set; }
public int? BarId{ get; set; }
[ForeignKey("BarId")]
public virtual BAR bar { get; set; }
}
并修改OnModelCreating
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Log>()
.HasOptional(p => p.bar)
.WithMany()
.HasForeignKey(p => p.barID);
}
所以这意味着关系是可选的,当你删除Bar时,它会将Log.barid更新为null并删除相应的Bar。
但首先你应该加载它们。