【问题标题】:C# repository pattern SQL query with Entity Framework 6 exception data reader is incompatible with specified entity使用 Entity Framework 6 异常数据读取器的 C# 存储库模式 SQL 查询与指定实体不兼容
【发布时间】:2018-09-03 15:09:08
【问题描述】:

我尝试执行自定义 SQL 查询。但是,当我执行我的方法时出现以下错误。

来源:实体框架

消息:数据读取器与指定的“SomeProject.Data.Entities.Config”不兼容。类型的成员“Id”在数据读取器中没有同名的对应列。

这是我的方法:

private readonly IRepositoryAsync<Config> _configRepository;

private IEnumerable<Config> getConfig()
{
    var sqlCommand = "select * from tbl_Config";

    return this._configRepository.SelectQuery(sqlCommand);
}

这是我的实体类:

public class Config : Entity
{
    public int Id { get; set; }

    public string Key { get; set; }
    public string Value { get; set; }
    public string ValueType { get; set; }
    public string Description { get; set; }
}

这是我的IRepositoryAsync

public interface IRepositoryAsync<TEntity> : IRepository<TEntity> where TEntity : class, ITrackable
{
    Task<TEntity> FindAsync(params object[] keyValues);
    Task<TEntity> FindAsync(CancellationToken cancellationToken, params object[] keyValues);
    Task<bool> DeleteAsync(params object[] keyValues);
    Task<bool> DeleteAsync(CancellationToken cancellationToken, params object[] keyValues);
    Task<int> ExecuteCustomSQL(string sqlCommand, params object[] parameters);
} 

这是我在存储库中的 .SqlQuery 方法:

public virtual IQueryable<TEntity> SelectQuery(string query, params object[] parameters)
{
    return this.Set.SqlQuery(query, parameters).AsQueryable();
}

这是映射:

// Table & Column Mappings
this.ToTable("db.TBL_CONFIG");
this.Property(t => t.Id).HasColumnName("PK_CONF");
this.Property(t => t.Key).HasColumnName("KEY");
this.Property(t => t.Value).HasColumnName("VALUE");
this.Property(t => t.ValueType).HasColumnName("VALUETYPE");
this.Property(t => t.Description).HasColumnName("DESCRIPTION");

我选择的 SQL 命令很简单,因为我想先测试.SqlQuery 方法。它说它找不到“Id”的列名,尽管我检查了映射并且它肯定存在。

我错过了什么吗?

【问题讨论】:

  • 如果您在return this.Set.SqlQuery(query, parameters).AsQueryable(); 设置了一个制动点,您能否验证查询是否正确以及您的目标数据库是否正确?
  • 你能包含你的数据库架构吗?
  • @Stefan 我会这样做的。给我一秒钟
  • SqlQuery 方法不考虑映射。它期望 sql 包含所有实体属性名称(不是列名称),因此如果您有差异,则必须使用带有列别名的 select 而不是 *。
  • 不,应该是这样的“select PK_CONF Id, Key, Value, ValueType, Description from tbl_Config”。注意“Id”别名。

标签: c# sql entity-framework-6 repository-pattern


【解决方案1】:

感谢@IvanStoev,我现在已经解决了。实际上,该方法没有考虑映射。因此,它期望 sql 包含所有实体属性名称(而不是列名称)。

映射:

// Table & Column Mappings
this.ToTable("db.TBL_CONFIG");
this.Property(t => t.Id).HasColumnName("PK_CONF");
this.Property(t => t.Key).HasColumnName("KEY");
this.Property(t => t.Value).HasColumnName("VALUE");
this.Property(t => t.ValueType).HasColumnName("VALUETYPE");
this.Property(t => t.Description).HasColumnName("DESCRIPTION"); 

正如您在this.Property(t =&gt; t.Id).HasColumnName("PK_CONF"); 行中看到的,实体属性名称和列名称之间存在差异。

解决sql命令:

private readonly IRepositoryAsync<Config> _configRepository;

private IEnumerable<Config> getConfig()
{
    var sqlCommand = "select PK_CONF AS Id, Key, Value, ValueType, Description from TBL_CONFIG";

    return this._configRepository.SelectQuery(sqlCommand);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2017-12-31
    相关资源
    最近更新 更多