Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在EF Core中保存实体时,仅使用导航属性的ID会为该属性返回null_C#_Entity Framework Core - Fatal编程技术网

C# 在EF Core中保存实体时,仅使用导航属性的ID会为该属性返回null

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

在EntityFrameworkCore3中,我试图保存一个实体。因为我不想在已经知道Id的情况下检索User字段的链接对象,所以我只设置该属性的Id字段

这是我的实体(精简版):

[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导弹是的,这很有效!!非常感谢。您能否将此添加为答案,以便我可以在解决方案中标记它?:)看来我庆祝得太早了。我添加了你的代码,它成功了。但有趣的是,当我删除此代码时,它现在也可以工作。从外观上看,修复它的不是附加,而是我添加和删除代码,以首先加载完整的用户实体,然后分配它。所以看起来有一个缓存问题。它应该在没有附加的情况下自动完成