如何留下孤儿数据?

时间:2018-05-14 04:02:52

标签: c# .net visual-studio-2017 entity-framework-6

使用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表中删除条目?我希望数据显示我的日志记录表中发生了什么,即使在我的系统中添加和删除条目。

2 个答案:

答案 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。

但首先你应该加载它们。