SQL-запрос шаблона репозитория C # с устройством чтения исключений Entity Framework 6 несовместим с указанным объектом - PullRequest
0 голосов
/ 03 сентября 2018

Я пытался выполнить пользовательский запрос SQL. Однако я получаю следующую ошибку при выполнении моего метода.

Источник: Entity Framework

Сообщение. Средство чтения данных несовместимо с указанным KPMG.DE.Impact.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», хотя я проверил сопоставление, и оно определенно там.

Я что-то пропустил?

1 Ответ

0 голосов
/ 04 сентября 2018

Благодаря @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 => 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...