Как использовать Entity Framework для сопоставления результатов хранимой процедуры с сущностью с параметрами с разными именами

Я пытаюсь создать базовый пример с использованием Entity Framework для сопоставления вывода SQL Хранимая процедура сервера для сущности в 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 (Key из ComponentModel и Column из EntityFramework) ... аля

public class UnitEntity : IUnit
{
    [Key]
    [Column("UT_ID")]
    public Int16 UnitId { get; set; }
    public string Name { get; set; }

Это вообще устранило необходимость в EntityTypeConfiguration для DBUnitEntity с имя, идентичное базе данных (т. е. просто добавление атрибута [Key]), но ничего не сделал для объекта с именами свойств, которые не соответствуют базе данных (та же ошибка, что и раньше).

Я не возражаю против использования Аннотации ComponentModel в модели, но я действительно не хочу использовать аннотации EntityFramework в модели, если могу помочь (не хочу привязывать модель к какой-либо конкретной структуре доступа к данным)

23
задан babernethy 29 March 2012 в 17:41
поделиться