gpt4 book ai didi

c# - Entity Framework 并不总是包括子实体

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:33 24 4
gpt4 key购买 nike

我有一个分配给 ClientUser。当拉出 User 对象时,我得到了 Client 对象作为它的一部分。简单。

这在登录时正常工作。User 对象有一个 Client,无论我以谁身份登录。

但是,使用完全与登录时相同的方法获取用户,通过管理菜单编辑它,客户端有时是 null

我说有时:

1) 在 Firefox 中 - 当试图查看大多数但不是所有用户(和我自己)的详细信息时,Client 附加到 User 将为 null。由于 Client 实际存在,因此只有几个 Users 是可见的。

2) 在 Chrome 中 - 所有用户(除了我自己)都是可见的。只有在尝试查看我自己的用户时,Client 才会为 null

我不明白;两种浏览器都只是转到相同的 URL,即 /Users/EditGet/28,甚至使用两种不同的方法(GetByIdGetByUserName)提供相同的结果 - 尽管不可否认两者都使用了基本的 Get 函数:

编辑:BaseService 类放在一起而不是编辑。

internal CustomContext context;
internal DbSet<TEntity> dbSet;

public BaseService(CustomContext context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}

public virtual IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet.Where(e => !e.Deleted);

if (filter != null)
{
query = query.Where(filter);
}

foreach (var includeProperty in includeProperties.Split(new [] {','}, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}

return orderBy != null ? orderBy(query).ToList() : query.ToList();
}

我不确定为什么浏览器的选择会影响后端查询的结果。当然,无论我使用什么浏览器,它都应该返回带有 UserClient

我假设基本 Get 方法可能存在基本错误,但它并不能解释我所看到的行为...

如果有人能阐明这一点,我将不胜感激。

编辑 2:自定义上下文:

public class CustomContext : DbContext, ICustomContext
{
public IDbSet<User> Users { get; set; }
public IDbSet<Client> Clients { get; set; }
}

最佳答案

您可能还想更改以逗号分隔的包含列表 - 这可能容易出现格式错误;您可以将其更改为参数或这样的数组:

        public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
params string[] includeProperties) {

var query = ((DbQuery<TEntity>)dbset);

query = includeProperties.Aggregate(query, (q, s) => q.Include(s));

query = query.Where(e => !e.IsDeleted);


if (filter != null) {
query = query.Where(filter);
}

return orderBy != null ? orderBy(query).ToList() : query.ToList();
}

我在想,如果它像您所说的那样依赖于浏览器,则可能存在一些字符串格式问题……无论如何值得一试。

编辑:将查询改回 DbQuery

EDIT2:解决方法是调用IncludeWhere 之前作为Include必须在 DbSet 上调用或 DbQuery .它看起来随机的原因是当没有过滤器时,然后在 DbSet/DbQuery 上调用 include 它们应该在的地方。

不容易发现,因为代码调用了 IQueryable<T>.Include ...这不是开箱即用的标准。 Include在 DbSet 或 DbQuery 上。

关于c# - Entity Framework 并不总是包括子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16944601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com