C# EF核心:仅将相关实体作为ID加载
我不确定我想要的是人们应该期望从EF得到的东西,但我想我在其他ORM中看到过这一点,在EF中解决这一问题应该是很常见的,所以我想问的是它是否得到了解决 我希望在查询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; } // ....
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));