Cómo usar Entity Framework para asignar resultados de un procedimiento almacenado a una entidad con parámetros con nombres diferentes
Estoy tratando de crear un ejemplo básico usando Entity Framework para hacer la asignación de la salida de un procedimiento almacenado de SQL Server a una entidad en C #, pero la entidad tiene parámetros de nombres diferentes (amigables) en lugar de los nombres más crípticos. También estoy tratando de hacer esto con la sintaxis fluida (es decir, no edmx).
Que funciona ...
El procedimiento almacenado devuelve valores llamados: UT_ID, UT_LONG_NM, UT_STR_AD, UT_CITY_AD, UT_ST_AD, UT_ZIP_CD_AD, UT_CT
Si creo un 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; }
}
y una EntityTypeConfiguration como esta ...
public class DbUnitMapping: EntityTypeConfiguration<DBUnitEntity>
{
public DbUnitMapping()
{
HasKey(t => t.UT_ID);
}
}
... que agrego en OnModelCreating del DbContext, entonces puedo obtener las entidades de la base de datos, lo cual es bueno, usando esto ...
var allUnits = _context.Database.SqlQuery<DBUnitEntity>(StoredProcedureHelper.GetAllUnitsProc);
PERO, lo que no funciona
Si quiero una entidad como esta, con nombres más amigables ...
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; }
}
y una EntityTypeConfiguration como esta ...
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");
}
Cuando trato de obtener los datos, obtengo un System.Data.EntityCommandExecutionException con el mensaje ...
"El lector de datos es incompatible con el 'DataAccess.EFCodeFirstSample.UnitEntity' especificado. Un miembro del tipo, 'UnitId', no tiene una columna correspondiente en el lector de datos con el mismo nombre."
Si agrego la propiedad "procedimiento almacenado llamado" a la entidad, aparece y se queja de la siguiente propiedad "desconocida".
¿"HasColumnName" no funciona como esperaba / quiero en este estilo fluido de procedimiento almacenado de código primero de EF?
Actualizar
Traté de usar Anotaciones de datos (Clave de ComponentModel y Columna de EntityFramework) ... ala
public class UnitEntity : IUnit
{
[Key]
[Column("UT_ID")]
public Int16 UnitId { get; set; }
public string Name { get; set; }
Eso eliminó la necesidad de cualquier EntityTypeConfiguration para DBUnitEntity con el nombre idéntico a la base de datos (es decir, simplemente agregando el atributo [Clave]), pero no hizo nada para la entidad con los nombres de propiedad que no coinciden con la base de datos (igual error como antes).
No me importa usar las anotaciones del modelo de componente en el modelo, pero realmente no quiero usar las anotaciones de EntityFramework en el modelo si puedo ayudarlo (no quiero vincular el modelo a ningún marco de acceso a datos específico) @