不能't设置可选外键为空与独立关联

本文关键字:关联 独立 设置 不能 | 更新日期: 2023-09-27 18:18:10

我在应用程序中有一个可选的独立关联外键,下面是关于db上下文和实体的简化版本。

public class AppContext : DbContext
{
    public DbSet<Foo> Foos { get; set; }
    public DbSet<Bar> Bars { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Bar>().HasOptional(b => b.Foo);
    }
}

实体

public class Foo
{
    public int Id { get; set; }
    public virtual ICollection<Bar> Bars { get; set; }
}
public class Bar
{
    public int Id { get; set; }
    public virtual Foo Foo { get; set; }
}

上下文和实体位于不同的程序集中,I 不能更改实体,因为它是子存储库,将被其他项目使用。

当我想通过将外键设置为null来删除外键时,它不会改变。

using (var db = new AppContext())
{
    var bar = db.Bars.Find(1);
    bar.Foo = null;
    db.SaveChanges();
}
这是

bar.Foo.Bars.Remove(bar);

但是在我的情况下,这不是一个解决方案,所有的栏将被加载到内存中,我不想有不必要的数据库往返。

我为什么要解决这个问题?

不能't设置可选外键为空与独立关联

我设法通过将它分配给未使用的变量来解决这个问题。

var bar = db.Bars.Find(1);
var foo = bar.Foo;
bar.Foo = null;
db.SaveChanges();

PS: null赋值两次或两次以上无效

bar.Foo = null;
bar.Foo = null;