C# 在EF Core中保存实体时,仅使用导航属性的ID会为该属性返回null
在EntityFrameworkCore3中,我试图保存一个实体。因为我不想在已经知道Id的情况下检索User字段的链接对象,所以我只设置该属性的Id字段 这是我的实体(精简版):C# 在EF Core中保存实体时,仅使用导航属性的ID会为该属性返回null,c#,entity-framework-core,C#,Entity Framework Core,在EntityFrameworkCore3中,我试图保存一个实体。因为我不想在已经知道Id的情况下检索User字段的链接对象,所以我只设置该属性的Id字段 这是我的实体(精简版): [Table("Samples")] public class Sample { public Sample() { } [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public
[Table("Samples")]
public class Sample
{
public Sample() { }
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public uint Id { get; set; }
public uint CreatedBy { get; set; }
[ForeignKey("CreatedBy")]
public virtual User CreatedByUser { get; set; }
}
我启用了UseLazyLoadingProxies(),这适用于其他实体
现在,因为我已经知道ID,不想做DB往返,所以我创建了一个新示例,如下所示,并使用用户ID 1:
var sample = new Sample
{
CreatedBy = 1
};
var result = await this._context.Samples.AddAsync(sample);
await this._context.SaveChangesAsync();
现在,在result.Entity中,我发现CreatedByUser为null且未代理,即使关系存在于数据库中并且已正确保存。当我单独检索实体时,它确实起作用
是否有任何方法可以在保存样本实体后直接获取正确的对象
编辑:为了增加混乱。当我这样做时:
var user = await userService.GetUserByIdAsync(1);
var sample = new Sample(sampleRequest)
{
CreatedByUser = user
};
它起作用了。但当我将此更改还原为以下内容时:
var sample = new Sample
{
CreatedBy = 1
};
它仍然有效
看起来有某种缓存系统正在运行
EDIT2:好吧,它不是缓存。只是打电话
wait userService.GetUserByIdAsync(1)代码>
让它工作
但是,我不想额外调用数据库,我希望SaveAllChanges()也能为我检索用户实体(不包括)。使用Attach()
,这会将实体附加到上下文并代理您的导航属性:
\u上下文。附加(示例)代码>
.我认为这是不可能的。您应该将检索用户视为一个单独的操作。通常,导航属性是延迟加载的,不需要单独的操作或包含。您尝试过附加吗<代码>\u上下文。附加(示例)代码>@MX导弹是的,这很有效!!非常感谢。您能否将此添加为答案,以便我可以在解决方案中标记它?:)看来我庆祝得太早了。我添加了你的代码,它成功了。但有趣的是,当我删除此代码时,它现在也可以工作。从外观上看,修复它的不是附加,而是我添加和删除代码,以首先加载完整的用户实体,然后分配它。所以看起来有一个缓存问题。它应该在没有附加的情况下自动完成