gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:00:53 25 4
gpt4 key购买 nike

在 Entity Framework Core 3 中,我试图保存一个实体。因为我不想在已经知道 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 并且不想进行数据库往返,所以我创建了一个这样的新示例并使用 UserId 为 1:
var sample = new Sample
{
CreatedBy = 1
};

var result = await this._context.Samples.AddAsync(sample);
await this._context.SaveChangesAsync();
现在在 result.Entity 中,我发现 CreatedByUser 为空且未代理,即使该关系存在于数据库中并且已正确保存。当我单独检索实体时,它确实有效。
有没有办法在保存样本实体后直接检索获取正确的对象?
编辑:至于增加困惑。当我这样做时:
var user = await userService.GetUserByIdAsync(1);

var sample = new Sample(sampleRequest)
{
CreatedByUser = user
};
有用。但是当我将此更改恢复为:
var sample = new Sample
{
CreatedBy = 1
};
它仍然有效!!!
看起来有某种缓存系统正在进行。
EDIT2:好的,这不是缓存。只是打电话 await userService.GetUserByIdAsync(1);使它工作。
但是,我不想对数据库进行这个额外的调用,我希望 SaveAllChanges() 也为我检索用户实体(没有包含)。

最佳答案

使用 Attach() ,这会将实体附加到上下文并代理您的导航属性:_context.Attach(sample); More on Attach() here .

关于c# - 在 EF Core 中保存实体时,仅使用导航属性的 ID 会为该属性返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66477523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com