Я использую Entity Framework 5 (с подходом Code First), чтобы заполнить класс моего из старой хранимой процедуры параметрами, и это работает нормально (подробности следуют). Моя проблема в том, что я хочу сопоставить имена столбцов с свойством с разными именами (мне не нравятся имена, исходящие от Erp). Я попытался использовать класс конфигурации (например, то, что я делаю, когда я сопоставляю представления или таблицы), чтобы указать имя столбца для свойств с другим именем, и вот мои результаты:
- Если я не использую класс конфигурации (я не добавляю его в методе OnModelCreating для DbContext), тогда EF работает, но загружает только свойства, которые точно совпадают с именем столбцов (и это то, что я ожидаемый в этом случае); other - null;
- Если я использую класс конфигурации (добавив его в modelBuilder в методе OnModelCreating для DbContext), то EF вызывает исключение, заявляя, что "Устройство чтения данных несовместимо с указанным"... Item ". type, 'Description', не имеет соответствующего столбца в устройстве чтения данных с тем же именем", и это звучит очень странно для меня, потому что в конфигурации я указываю, что свойство Description сопоставляется столбцу ItemDescription.
Почему настройка влияет на мой результат, но ее спецификация не используется для сопоставления столбцов? Есть ли другой способ указать это сопоставление с помощью SqlQuery?
Вот подробности:
Мой класс POCO:
public class Item
{
public String Id { get; set; }
public String Description { get; set; }
}
Класс конфигурации:
public class ItemConfiguration : EntityTypeConfiguration<Item>
{
public ItemConfiguration()
{
HasKey(x => new { x.Id });
Property(x => x.Id).HasColumnName("Code");
Property(x => x.Description).HasColumnName("ItemDescription");
}
}
Хранимая процедура возвращает данные с столбцами "Код" и "ItemDescription"; Я называю это следующим образом:
var par = new SqlParameter();
par.ParameterName = "@my_par";
par.Direction = ParameterDirection.Input;
par.SqlDbType = SqlDbType.VarChar;
par.Size = 20;
par.Value = ...;
var data = _context.Database.SqlQuery<Item>("exec spItem @my_par", par);
и с этим я добавляю конфигурацию в контекст:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ItemConfiguration());
}
Спасибо!