首页 > 解决方案 > 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。

标签: c#entity-framework-coreef-core-5.0

解决方案


推荐阅读