Como usar o Entity Framework para mapear resultados de um procedimento armazenado para entidade com parâmetros de nomes diferentes
Estou tentando criar um exemplo básico usando o Entity Framework para fazer o mapeamento da saída de um procedimento armazenado do SQL Server para uma entidade em C #, mas a entidade possui parâmetros de nomes diferentes (amigáveis) em oposição aos nomes mais enigmáticos. Também estou tentando fazer isso com a sintaxe Fluente (ou seja, não edmx).
O que funciona ...
O procedimento armazenado retorna valores chamados: UT_ID, UT_LONG_NM, UT_STR_AD, UT_CITY_AD, UT_ST_AD, UT_ZIP_CD_AD, UT_CT
Se eu criar um objeto como este ...
public class DBUnitEntity
{
public Int16 UT_ID { get; set; }
public string UT_LONG_NM { get; set; }
public string UT_STR_AD { get; set; }
public string UT_CITY_AD { get; set; }
public string UT_ST_AD { get; set; }
public Int32 UT_ZIP_CD_AD { get; set; }
public string UT_CT { get; set; }
}
e uma EntityTypeConfiguration assim ...
public class DbUnitMapping: EntityTypeConfiguration<DBUnitEntity>
{
public DbUnitMapping()
{
HasKey(t => t.UT_ID);
}
}
... que eu adiciono no OnModelCreating do DbContext, então posso obter as entidades muito bem do banco de dados, o que é bom, usando isso ....
var allUnits = _context.Database.SqlQuery<DBUnitEntity>(StoredProcedureHelper.GetAllUnitsProc);
MAS, o que não funciona
Se eu quiser uma entidade como essa, com nomes mais amigáveis ....
public class UnitEntity : IUnit
{
public Int16 UnitId { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string City { get; set; }
public string State { get; set; }
public Int32 Zip { get; set; }
public string Category { get; set; }
}
e uma EntityTypeConfiguration assim ...
public UnitMapping()
{
HasKey(t => t.UnitId);
Property(t => t.UnitId).HasColumnName("UT_ID");
Property(t => t.Name).HasColumnName("UT_LONG_NM");
Property(t => t.Address).HasColumnName("UT_STR_AD");
Property(t => t.City).HasColumnName("UT_CITY_AD");
Property(t => t.State).HasColumnName("UT_ST_AD");
Property(t => t.Zip).HasColumnName("UT_ZIP_CD_AD");
Property(t => t.Category).HasColumnName("UT_CT");
}
Quando tento obter os dados, recebo uma System.Data.EntityCommandExecutionException com a mensagem ....
"O leitor de dados é incompatível com o 'DataAccess.EFCodeFirstSample.UnitEntity'. Um membro do tipo, 'UnitId', não possui uma coluna correspondente no leitor de dados com o mesmo nome."
Se eu adicionar a propriedade "procedimento armazenado nomeado" à entidade, ela se queixa da próxima propriedade "desconhecida"
"HasColumnName" não funciona como eu espero / quero neste estilo fluente de procedimento armazenado com código primeiro do EF?
Atualizar
Tentei usar DataAnnotations (chave de ComponentModel e coluna de EntityFramework) ... ala
public class UnitEntity : IUnit
{
[Key]
[Column("UT_ID")]
public Int16 UnitId { get; set; }
public string Name { get; set; }
Isso removeu a necessidade de qualquer EntityTypeConfiguration para o DBUnitEntity com a nomeação idêntica ao banco de dados (ou seja, apenas adicionando o atributo [Key]), mas não fez nada para a entidade com os nomes de propriedades que não correspondem ao banco de dados (o mesmo erro como antes
Não me importo de usar as Anotações ComponentModel no modelo, mas realmente não quero usar as Anotações EntityFramework no modelo se puder ajudá-lo (não quero vincular o modelo a nenhuma estrutura específica de acesso a dados)