2 回答
TA贡献1875条经验 获得超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方法,但如果实体在本地不存在,则不会从数据库加载实体。
您的案例的用法如下:
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条经验 获得超2个赞
我多年来一直在使用 EF,但我从未使用过附加机制,它通常只会让您陷入困境。
如果我查看代码,我猜您想在 2 个用户记录之间创建关系,但您想通过不查询两个用户记录来优化性能。(就我个人而言,我不会关心 20 毫秒的开销,它会花费我获取用户对象,但我想这可能很重要)。
EF 允许您使用外键创建记录,而无需加载外部实体。
因此,您可以从以下代码更改以下代码:
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 将创建带有 2 个有效外键的 UserRelation 记录。
- 2 回答
- 0 关注
- 168 浏览
添加回答
举报