2 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以搜索該DbSet<T>.Local屬性,但這將是低效的。
IMO 的更好方法是使用FindTracked我的回答中的自定義擴(kuò)展方法,以在 EntityFrameworkCore 中按 ID 刪除加載和卸載的對(duì)象
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;
}
}
}
這類(lèi)似于 EF CoreFind方法,但如果實(shí)體在本地不存在,則不會(huì)從數(shù)據(jù)庫(kù)加載實(shí)體。
您的案例的用法如下:
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貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊
我多年來(lái)一直在使用 EF,但我從未使用過(guò)附加機(jī)制,它通常只會(huì)讓您陷入困境。
如果我查看代碼,我猜您想在 2 個(gè)用戶記錄之間創(chuàng)建關(guān)系,但您想通過(guò)不查詢(xún)兩個(gè)用戶記錄來(lái)優(yōu)化性能。(就我個(gè)人而言,我不會(huì)關(guān)心 20 毫秒的開(kāi)銷(xiāo),它會(huì)花費(fèi)我獲取用戶對(duì)象,但我想這可能很重要)。
EF 允許您使用外鍵創(chuàng)建記錄,而無(wú)需加載外部實(shí)體。
因此,您可以從以下代碼更改以下代碼:
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);
請(qǐng)注意,在我的上一個(gè)代碼示例中,我沒(méi)有查詢(xún)兩個(gè)用戶對(duì)象,但 EF 將創(chuàng)建帶有 2 個(gè)有效外鍵的 UserRelation 記錄。
- 2 回答
- 0 關(guān)注
- 192 瀏覽
添加回答
舉報(bào)