我的系统中的所有用户都分布在 2 个数据库的 2 个表中。是的,我知道这不太好,但我们有一个身份数据库,其中包含用户的登录信息以及电子邮件、电话等。我使用该数据库,但无法更改其架构。
然后我就有了我的数据库。它还有一个用户表,其中包含每个用户的大量属性。它们共享一个属性,即 IdentityUser.Id 值。我有责任根据需要让它们保持同步。
我有一个类,它具有两个数据库的 DbContext,并且它一起对它们执行操作,以保持它们同步。除了定义我的用户记录的包含内容之外,一切都运行良好。目前我有:
public async Task<CombinedUser?> FindAsync(int userId, params string[] includes)
{
Trap.Break();
IQueryable<AppUser> query = AppDbContext.AppUsers;
foreach (var include in includes)
query = query.Include(include);
query = query.Where(u => u.Id == userId);
var user = await query.FirstOrDefaultAsync();
if (user == null)
return null;
var identityUser = await IdentityDbContext.Users.FindAsync(user.IdentityUsersId);
if (identityUser == null)
return null;
return new CombinedUser(identityUser, user);
}
这效果很好。但我更希望能够在
Include().Include().Include()
而不是 string[] includes
上传递一组。有办法做到吗?
方法签名:
public async Task<CombinedUser?> FindAsync(int userId, params Expression<Func<AppUser, object>>[] includes)
方法体不变。
致电:
var user = await FindAsync(id, x => x.Foo, x => x.Bars);