如何找到导航属性的外键字段?

3

通过调用给定实体的方法,可以获取该实体的所有引用。

var references = dbContext.Entry(entity).References;

现在我想将所有引用设置为 null。

foreach (var reference in references)
{
  reference.CurrentValue = null;
}
context.Update(entity);
context.SaveChanges();

但实际上仅将引用设置为null是不够的,还必须同时设置外键属性。但是如何找到给定引用的外键字段呢?

1个回答

4

你可以使用元数据属性来获取相关的INavigation,然后使用ForeignKey属性来获取相关的IForeignKey,再使用Properties属性来获取类型为IProperty的相关属性,最后使用Name属性将其传递给Property方法以获取相关的PropertyEntry以操作值。
将所有这些付诸实践:
var entry = dbContext.Entry(entity);
foreach (var reference in entry.References)
{
    reference.CurrentValue = null;
    foreach (var fkProperty in reference.Metadata.ForeignKey.Properties)
        entry.Property(fkProperty.Name).CurrentValue = null;
}

不幸的是,这似乎会在它是关系的主要一侧时获取引用,以至于它将给出属性Foo.BarId,然后无法找到它。 - Captain Prinny
@CaptainPrinny 可以使用 reference.Metadata.IsDependentToPrincipal() 来识别这样的引用并在需要时跳过它们。 - Ivan Stoev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接