Я пытаюсь создать базовый пример, используя Entity Framework для сопоставления вывода хранимой процедуры SQL Server с сущностью в C #, но сущность имеет параметры имен (дружественных) по-разному, в отличие от более загадочных имен , Я также пытаюсь сделать это с помощью синтаксиса Fluent (т.е. не edmx).
Что работает ....
Хранимая процедура возвращает значения, называемые: UT_ID, UT_LONG_NM, UT_STR_AD, UT_CITY_AD, UT_ST_AD, UT_ZIP_CD_AD, UT_CT
Если я создаю такой объект ...
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; }
}
и EntityTypeConfiguration, как это ...
public class DbUnitMapping: EntityTypeConfiguration<DBUnitEntity>
{
public DbUnitMapping()
{
HasKey(t => t.UT_ID);
}
}
... который я добавляю в OnModelCreating DbContext, тогда я могу просто отлично получить сущности из базы данных, что неплохо, используя это ....
var allUnits = _context.Database.SqlQuery<DBUnitEntity>(StoredProcedureHelper.GetAllUnitsProc);
НО, что не работает
Если я хочу такую сущность с более дружелюбными именами ....
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; }
}
и подобная EntityTypeConfiguration ...
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");
}
Когда я пытаюсь получить данные, я получаю исключение System.Data.EntityCommandExecutionException с сообщением ....
"Считыватель данных несовместим с указанным DataAccess.EFCodeFirstSample.UnitEntity '. Член типа UnitId не имеет соответствующего столбца в считывателе данных с тем же именем."
Если я добавлю свойство «хранимая процедура с именем» к сущности, оно пойдет и пожалуется на следующее «неизвестное» свойство.
Разве «HasColumnName» не работает так, как я ожидаю / хочу, чтобы это было в стиле беглых хранимых процедур в коде, в начале EF?
Обновление:
Пробовал с использованием DataAnnotations (ключ из ComponentModel и столбец из EntityFramework) ... ala
public class UnitEntity : IUnit
{
[Key]
[Column("UT_ID")]
public Int16 UnitId { get; set; }
public string Name { get; set; }
Это вообще устраняло необходимость в какой-либо EntityTypeConfiguration для DBUnitEntity с идентификатором, идентичным базе данных (т.е. просто добавляя атрибут [Key]), но ничего не делало для объекта с именами свойств, которые не соответствуют базе данных (та же ошибка, что и раньше).
Я не против использовать аннотации ComponentModel в модели, но я действительно не хочу использовать аннотации EntityFramework в модели, если я могу помочь (не хочу связывать модель с каким-либо конкретным доступом к данным рамки)