c# - EF Core 5 表达式“x.FavePlugins”在“包含”操作中无效,因为它不代表属性访问:“t => t.MyProperty”
问题描述
我配置了以下架构:
public sealed class User : Entity
{
public string Account { get; set; } = null!;
}
public sealed class UserPreference : Entity
{
public long UserId { get; set; }
public User User { get; set; } = null!;
public List<UserFavoritePlugin> FavePlugins = new List<UserFavoritePlugin>();
}
public sealed class UserFavoritePlugin : Entity
{
public long UserPreferencesId { get; set; }
public UserPreference UserPreference { get; set; } = null!;
public string PluginName { get; set; } = null!;
}
使用以下映射:
public sealed class UsersMapping : EntityMapping<User>
{
protected override void ConfigureInternal(EntityTypeBuilder<User> b)
{
}
}
public sealed class UserPreferenceMapping : EntityMapping<UserPreference>
{
protected override void ConfigureInternal(EntityTypeBuilder<UserPreference> b)
{
b.HasMany(x => x.FavePlugins).WithOne().HasForeignKey(x => x.UserPreferencesId);
}
}
public sealed class UserFavoritePluginMapping : EntityMapping<UserFavoritePlugin>
{
protected override void ConfigureInternal(EntityTypeBuilder<UserFavoritePlugin> b)
{
b.HasOne(x => x.UserPreference).WithMany().HasForeignKey(x => x.UserPreferencesId);
}
}
创建迁移,一切看起来都很好,FK 关系看起来准确指向UserFavoritePlugin
->UserPreference
表。
但是当我尝试运行以下查询时:
var prefs = _dataAccess.Query<UserPreference>(x => x.FavePlugins)
.Where(x => x.UserId == _userInformation.UserId)
.FirstOrDefault();
//DataAccess implementation of querying with an include
private IQueryable<T> Query_Internal<T>() where T : class, IEntity
{
var q = _dbContext.Set<T>().AsQueryable();
q = q.Where(x => !x.IsDeleted);
return q;
}
private IQueryable<T> Query_Internal<T>(params Expression<Func<T, object>>[] includes) where T : class, IEntity
{
var q = Query_Internal<T>();
foreach (var i in includes)
q = q.Include(i);
return q;
}
我收到以下错误:
表达式“x.FavePlugins”在“包含”操作中无效,因为它不代表属性访问:“t => t.MyProperty”。要定位在派生类型上声明的导航,请使用强制转换 ('t => ((Derived)t).MyProperty') 或 'as' 运算符 ('t => (t as Derived).MyProperty')。集合导航访问可以通过组合 Where、OrderBy(Descending)、ThenBy(Descending)、Skip 或 Take 操作进行过滤。有关包含相关数据的详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=746393。
我还尝试在对象上而不是在映射配置文件中指定 FK 关系,但这给出了相同的错误。在“包含”操作中无效,因为它不代表属性访问:“t => t.MyProperty”
据我所知,我的映射设置正确。我的映射有什么问题,EF 认为我没有进行属性访问?每次架构更改后,我都会删除我的数据库和迁移并重新创建它们。
带有 Sqlite 数据库的 EF Core 5.0.4。
解决方案
推荐阅读
- css - 在页脚标签中,即图像的最后,我想要一个在左边(紧急联系人)和另一个在右边(在线顾问)???怎么做?
- php - 如果 sql 列具有特定值,则重定向
- reactjs - 如何从反应中的功能打开对话框?
- machine-learning - 用于神经网络训练的数据编码
- algorithm - 点数最多的路段算法分析
- javascript - React 组件是否会深入比较 props 以检查是否需要重新渲染?
- php - Laravel 从文件中读取数组的最佳实践
- web2py - web2oy中多个字段名一起表示数据库记录
- mysql - 如果数据为空,则通过比较所有列来更新列
- c# - 使用 c# 的 WebSocket 连接问题