Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql EntityFramework存储库,所有行返回空值_Mysql_Asp.net_Database_Entity Framework_Entity Framework 6 - Fatal编程技术网

Mysql EntityFramework存储库,所有行返回空值

Mysql EntityFramework存储库,所有行返回空值,mysql,asp.net,database,entity-framework,entity-framework-6,Mysql,Asp.net,Database,Entity Framework,Entity Framework 6,摘要 我已经修改了nopCommerce解决方案,使用CodeFirst方法包含了一个新实体,它已经成功地更新了数据库,如下图所示 当我尝试访问通过AutoFrac插入的存储库表时,我会得到存储库返回的行,但所有列都显示空值。 请注意,表中的行数与数据库表中的行数相同,因此它似乎已连接,但未显示值 存储库确实可以与其他表一起使用,但下面是存储库代码 /// </summary> public virtual IQueryable<TEntity&

摘要

我已经修改了nopCommerce解决方案,使用CodeFirst方法包含了一个新实体,它已经成功地更新了数据库,如下图所示

当我尝试访问通过AutoFrac插入的存储库表时,我会得到存储库返回的行,但所有列都显示空值。 请注意,表中的行数与数据库表中的行数相同,因此它似乎已连接,但未显示值

存储库确实可以与其他表一起使用,但下面是存储库代码

      /// </summary>
        public virtual IQueryable<TEntity> Table => Entities;

        /// <summary>
        /// Gets an entity set
        /// </summary>
        protected virtual ITable<TEntity> Entities => _entities ?? (_entities = _dataProvider.GetTable<TEntity>());


        #endregion
    }
//
公共虚拟IQueryable表=>实体;
/// 
///获取一个实体集
/// 
受保护的虚拟ITable实体=>\u实体??(_entities=_dataProvider.GetTable());
#端区
}

我怀疑你要么在抽象中迷失了方向,要么他们至少隐藏了一个问题

首先剥离所有的抽象,作为存储库。将DbContext作为起点插入:

protected readonly AppDbContext _context = null;

public NutrientService(AppDbContext context)
{
    _context = context ?? throw new ArgumentNullException("context");
}

public IList<ProductNutrient> GetNutrients()
{
    var productNutrients = context.ProductNutrients
        .ToList();

    return productNutrients;
}
protected readonly AppDbContext\u context=null;
公共NutrientService(AppDbContext上下文)
{
_上下文=上下文??抛出新的ArgumentNullException(“上下文”);
}
公共IList(第页)
{
var productNutrients=context.productNutrients
.ToList();
归还产品养分;
}
这是返回完整数据还是返回空值?如果它仍然是空的,那么您需要检查运行时使用的连接字符串,因为它可能指向比您现在看到的旧的数据库实例。这似乎是一个相当常见的问题,人们使用SSM或设计器来查看DB模式,但运行时web/app.config指向一个旧的或共享的DB位置,或者指向一个生成的DB,该DB包含一些数据,但不是您期望看到的

如果它返回的是您期望的数据,那么您的抽象(存储库)在某些方面存在缺陷。第一个问题是“为什么要围绕DbContext实现一个存储库?”当涉及到存储库时,我的建议是,通用存储库,即
Repository
是一种非常糟糕的反模式。如果您在实现存储库时遇到了一个存储库示例,那么您需要了解其根本原因。如果实现存储库是为了“隐藏”正在使用EntityFramework或隐藏DbContext的事实,那么这是实现存储库的错误原因。考虑在EntityFramework上实现一个存储库模式的唯一原因是使您的代码更容易进行单元测试。为此,我强烈建议利用
IQueryable
作为返回类型。可能
.Table
正在返回
IQueryable
,但是如果它正在返回
DbSet
,那么您也可以只使用DbContext。如果它返回类似于
IEnumerable
的内容,那么随着您失去EF所能提供的大部分功能,您的系统可能会面临巨大的性能限制


如果您不打算在需要模拟数据层以便测试获得可靠的已知状态的情况下使用单元测试,那么实际上没有任何理由创建存储库类,并且可能会对数据访问施加非常昂贵的限制。我在回答这个问题时概述了通用存储库模式和EF的问题:()您可以使用专用的集成测试数据库映像或内存中数据库,或者通过稍微多做一点工作,模拟DbContext/DBSET来完全测试使用DbContext的代码。对于在集成之前的开发过程中反复运行的单元测试,模拟存储库类要简单得多。

请不要将代码和结果作为图像发布。它们不能被复制(部分)用于回答,它们的“文本”也不会出现在搜索引擎中。图片只能作为最后手段使用。更新谢谢。这是我第一次向SO发帖。我希望你也能在这个问题上提供一些支持。感谢Dan
选择p作为产品营养素
可能不会做你认为的事,
p
是另外一回事。你为什么要投它呢?但是我们看不到存储库(尤其是
\u productNutrientRepository.Table
),而且,没有所有图像,仍然可以问这个问题。我想知道这是什么_productNutrientRepository.Table?你能给我们看一下_productNutrientRepository代码和表代码吗?嘿@Sergey,我已经更新了帖子来展示这一点。我的项目中还有其他服务引用了存储库接口,并且工作得很好。我有点不明白为什么_productNutrientRepository.Table会显示列表中的项,但具有空值。当我插入值时也会发生这种情况,它只会创建空记录。感谢您的帮助,通过查看DBContext解决了这个问题。离开回购模式是不值得的,我正在开发一个利用它的开源框架,花时间去改变所有这些都不会带来显著的价值来保证它的改变。
      /// </summary>
        public virtual IQueryable<TEntity> Table => Entities;

        /// <summary>
        /// Gets an entity set
        /// </summary>
        protected virtual ITable<TEntity> Entities => _entities ?? (_entities = _dataProvider.GetTable<TEntity>());


        #endregion
    }
protected readonly AppDbContext _context = null;

public NutrientService(AppDbContext context)
{
    _context = context ?? throw new ArgumentNullException("context");
}

public IList<ProductNutrient> GetNutrients()
{
    var productNutrients = context.ProductNutrients
        .ToList();

    return productNutrients;
}