2 回答

TA貢獻1875條經(jīng)驗 獲得超3個贊
您可以搜索該DbSet<T>.Local屬性,但這將是低效的。
IMO 的更好方法是使用FindTracked我的回答中的自定義擴展方法,以在 EntityFrameworkCore 中按 ID 刪除加載和卸載的對象
using Microsoft.EntityFrameworkCore.Internal;
namespace Microsoft.EntityFrameworkCore
{
public static partial class CustomExtensions
{
public static TEntity FindTracked<TEntity>(this DbContext context, params object[] keyValues)
where TEntity : class
{
var entityType = context.Model.FindEntityType(typeof(TEntity));
var key = entityType.FindPrimaryKey();
var stateManager = context.GetDependencies().StateManager;
var entry = stateManager.TryGetEntry(key, keyValues);
return entry?.Entity as TEntity;
}
}
}
這類似于 EF CoreFind方法,但如果實體在本地不存在,則不會從數(shù)據(jù)庫加載實體。
您的案例的用法如下:
var user1 = ctx.FindTracked(1) ?? ctx.Attach(new User { Id = 1 }).Entity;
var user2 = ctx.FindTracked(2) ?? ctx.Attach(new User { Id = 2 }).Entity;
AddUserRelation(user1, user2);

TA貢獻1820條經(jīng)驗 獲得超3個贊
我多年來一直在使用 EF,但我從未使用過附加機制,它通常只會讓您陷入困境。
如果我查看代碼,我猜您想在 2 個用戶記錄之間創(chuàng)建關系,但您想通過不查詢兩個用戶記錄來優(yōu)化性能。(就我個人而言,我不會關心 20 毫秒的開銷,它會花費我獲取用戶對象,但我想這可能很重要)。
EF 允許您使用外鍵創(chuàng)建記錄,而無需加載外部實體。
因此,您可以從以下代碼更改以下代碼:
var user1 = context.Users.Find(1);
var user2 = context.Users.Find(2);
var userRelation = new UserRelation();
userRelation.FromUser = user1;
userRelation.ToUser = user2;
context.UserRelations.Add(userRelation);
到 :
var userRelation = new UserRelation();
userRelation.FromUserId = 1;
userRelation.ToUserId = 2;
context.UserRelations.Add(userRelation);
請注意,在我的上一個代碼示例中,我沒有查詢兩個用戶對象,但 EF 將創(chuàng)建帶有 2 個有效外鍵的 UserRelation 記錄。
- 2 回答
- 0 關注
- 200 瀏覽
添加回答
舉報