我在应用程序中有一个可选的独立关联外键,这里是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; }
}
上下文和实体位于不同的程序集中,我无法更改实体,因为它是一个子存储库,将由其他项目使用。
问题
当我想通过将外键设置为null来删除外键时,它不会改变。
using (var db = new AppContext())
{
var bar = db.Bars.Find(1);
bar.Foo = null;
db.SaveChanges();
}
这有效
bar.Foo.Bars.Remove(bar);
但在我的情况下,它不是解决方案,所有条形码都会加载到内存中,我不想让不必要的数据库往返。
为什么以及如何解决这个问题?
答案 0 :(得分:3)
我设法通过将其分配给未使用的变量来解决它。
var bar = db.Bars.Find(1);
var foo = bar.Foo;
bar.Foo = null;
db.SaveChanges();
PS:将空值分配两次或更多不起作用。
bar.Foo = null;
bar.Foo = null;