簡體   English   中英

EF Core 通過克隆獲取被跟蹤的實體

[英]EF Core Get tracked entity by clone

簡單問題:如何使用克隆(相同的主鍵值)獲取被跟蹤的實體。 由於映射,我沒有被跟蹤的實體,而是它的一個克隆。 如果使用 IClonable 或像 Mapster 這樣的映射(適應相同的類型,或者在我的例子中是基本類型),如何獲得克隆並不重要。 我想避免在不必要時執行查詢。

我嘗試了什么:

dbContext.Entry(clone) // ---> Always detached even if a tracked entity exists
dbContext.Table.FindAsync(clone) // ---> Crashed because clone is no primary key value

因為我可以使用dbContext.Table.FindAsync([primary/composite key values]) 但是,如果復合鍵在遷移中發生變化怎么辦。 例如,當您從 MySQL 遷移到 Postgres 並且您存儲例如 GPS 坐標時,不是在緯度/經度中而是在點 object 中。

解決方案:

public static class DbContextExtensions {
    public static async Task<TEntity?> FindTrackedAsync<TEntity>(this DbContext context, TEntity entity) where TEntity : class {
        var entityType = context.Model.FindRuntimeEntityType(typeof(TEntity));
        var keyProperties = entityType?.FindPrimaryKey()?.Properties;

        if (keyProperties is null)
            return null;

        var keyValues = keyProperties.Select(prop => prop.GetGetter().GetClrValue(entity)).ToArray();
        return await context.FindAsync<TEntity>(keyValues);
    }
}

暫無
暫無

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

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