【发布时间】: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