簡體   English   中英

在 EF Core 中保存實體時,僅使用導航屬性的 ID 會為該屬性返回 null

[英]When saving an entity in EF Core, using only an ID for a navigational property returns null for that property

在 Entity Framework Core 3 中,我試圖保存一個實體。 因為我不想在我已經知道 Id 的情況下檢索 User 字段的鏈接 object,所以我只設置該屬性的 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 並且不想進行數據庫往返,所以我創建了一個這樣的新示例並使用 1 的 UserId:

var sample = new Sample
{
    CreatedBy = 1
};

var result = await this._context.Samples.AddAsync(sample);
await this._context.SaveChangesAsync();

現在在 result.Entity 中,我發現 CreatedByUser 是 null 並且沒有被代理,即使關系存在於數據庫中並且它被正確保存。 當我單獨檢索實體時,它確實有效。

有沒有辦法在保存示例實體后直接檢索得到正確的 object?

編輯:至於增加混亂。 當我這樣做時:

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);

更多關於 Attach() 的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM