Я пытаюсь создать базовый пример с использованием Entity Framework, чтобы выполнить сопоставление вывода хранимой процедуры SQL Server с сущностью на С#, но объект имеет разные (дружественные) параметры имен, а не более критические имена, Я также пытаюсь сделать это с синтаксисом 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?
Update:
Пробовал использовать 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 в модели, если я могу помочь (не хочу привязывать модель к любому конкретному доступу к данным рамки)