C# EF核心:仅将相关实体作为ID加载

C# EF核心:仅将相关实体作为ID加载,c#,entity-framework-core,C#,Entity Framework Core,我不确定我想要的是人们应该期望从EF得到的东西,但我想我在其他ORM中看到过这一点,在EF中解决这一问题应该是很常见的,所以我想问的是它是否得到了解决 我希望在查询EF时能够急切地加载外键实体,但只加载它们的ID,因为对象的其他部分将在以后加载 我有: class A { public int Id { get; set; } public B B { get; set; } } class B { public int Id { get; set; } // ....

我不确定我想要的是人们应该期望从EF得到的东西,但我想我在其他ORM中看到过这一点,在EF中解决这一问题应该是很常见的,所以我想问的是它是否得到了解决

我希望在查询EF时能够急切地加载外键实体,但只加载它们的ID,因为对象的其他部分将在以后加载

我有:

class A {
   public int Id { get; set; }
   public B B { get; set; }
}

class B {
   public int Id { get; set; }
   // .... more properties
} 
以及一个web API,该API应返回所有As的列表,使用此视图模型:

class AViewModel {
   public int Id { get; set; }
   public int BId { get; set; }
}
我想确保在查询时不包含B表联接-出于性能原因。我还使用
automapper
A
映射到
AViewModel

目前,我发现最好的方法是:

var a = context.As;
var aList = a.Select(x => new { model = x, bid = x.B.Id }).ToList();
return Ok(mapper.Map<List<AViewModel>(aList));
但在这种情况下,它会因
NullReferenceException
而失败,因为
aList
的每个项都有
B
属性
null

我可以编写
context.As.Include(x=>x.B)
,但这将加入B表,这是我想要避免的

我想我已经看到一些orm能够用空对象填充
B
对象,除了id,这就是我在EF中寻找的行为。它能做到吗


如果不是,也许有人能提出一个更好的解决问题的方法?也许我可以用惰性代理解决这个问题?

将foreignKey属性放在A类上:

A类{
公共int Id{get;set;}
公共整数BId{get;set;}
[ForeignKey(“BId”)]//可以改为在fluent API中执行此操作
公共虚拟B{get;set;}
}

然后,您只需在映射中使用类A,而无需加载B实体

将foreignKey属性放在类A上:

A类{
公共int Id{get;set;}
公共整数BId{get;set;}
[ForeignKey(“BId”)]//可以改为在fluent API中执行此操作
公共虚拟B{get;set;}
}

然后,您可以在映射中使用类A,而无需加载B实体

这是简洁和正确的。只是想补充一点,如果遵循命名约定(在示例中就是这样),甚至不需要通过attribute/fluent API显式配置关系。我对此并不100%满意,因为这迫使我拥有一个除了
Automapper
config之外在任何地方都不使用的属性,但这确实是获得我想要的东西的正确且可能是最好的方式。这也让我惊讶,这是多么容易,我以前没有想到这一点,并期待着更复杂的答案。谢谢这句话简洁正确。只是想补充一点,如果遵循命名约定(在示例中就是这样),甚至不需要通过attribute/fluent API显式配置关系。我对此并不100%满意,因为这迫使我拥有一个除了
Automapper
config之外在任何地方都不使用的属性,但这确实是获得我想要的东西的正确且可能是最好的方式。这也让我惊讶,这是多么容易,我以前没有想到这一点,并期待着更复杂的答案。谢谢
var a = context.As;
var aList = a.ToList();
return Ok(mapper.Map<List<AViewModel>(aList));