2016-05-09 6 views
1

У меня проблема с отображением свойства объекта в столбец из функции базы данных.Сопоставление столбцов структуры Entity Framework

Функция базы данных возвращает столбец с именем [On Hand]. Поэтому мое свойство модели называется OnHand.

Это, очевидно, неверно отображает и не позволяет правильно восстановить данные для этого столбца.

Я попытался следующие, чтобы решить эту проблему:

Редактирование модели использовать аннотацию

[Column("On Hand")] 
public int OnHand { get; set; } 

Использование Fluent API

modelBuilder.Entity<BinDetail>() 
    .Property(e => e.OnHand) 
    .HasColumnName("On Hand"); 

Ни один из них подходы работали либо вместе, либо независимо.

Единственный способ, которым я могу заставить это работать в тестовой базе данных, - это изменить столбец возврата функции на [OnHand], однако из-за других систем, использующих эту функцию, это не вариант для использования в живой базе данных ,

Любые предложения кто-нибудь будет с благодарностью

ответ

1

Если вы используете Entity Framework Core 1.0 RC 1, есть ошибка (она исправлена ​​на RC2 и далее) вызывает это.

Обходной заказывает поля от А до Я, быстрый образец:

"SELECT " + GetColumnNames<Unit>("R") + " FROM Unit AS R" 

методы Helper:

private static Dictionary<Type, PropertyInfo[]> getPropertiesCache = new Dictionary<Type, PropertyInfo[]>(); 

public static string GetColumnNames<T>(string prefix) 
{ 
    var columns = GetProperties(typeof(T)).OrderBy(i => i.Name).Select(i => $"[{prefix}].[{i.Name}]"); 

    return string.Join(", ", columns); 
} 

public static IEnumerable<PropertyInfo> GetProperties(Type type) 
{ 
    if (getPropertiesCache.ContainsKey(type)) 
     return getPropertiesCache[type].AsEnumerable(); 

    var properties = type 
     .GetTypeInfo() 
     .DeclaredProperties; 

    getPropertiesCache.Add(type, properties.ToArray()); 

    return getPropertiesCache[type].AsEnumerable(); 
} 
+0

Не могли бы вы объяснить, почему это работает и как это работает, пожалуйста, как я борюсь проследить за ним немного. Моя ссылка EntityFramework - v4.0.30319 – DaRoGa

+0

Это ошибка (https://github.com/aspnet/EntityFramework/issues/4940) с EF Core 1.0 RC1, если вы ее не используете, это обходное решение не устранит вашу проблему. Я обычно заказываю имена столбцов A-Z, чтобы они правильно отображались. –

+0

У меня есть upvoted, поскольку кажется, что это может быть очень полезным решением для кого-то, и это хороший ответ, но, к сожалению, он не работал для меня – DaRoGa

1

После копания в мой код, я понял, что так, как я выполнил функцию заключается в использовании:

Database.SqlQuery<BinDetail>("Query for function").ToList(); 

Таким образом, я понял, что один решение для этого было бы изменить запрос от:

SELECT * FROM.....

к:

SELECT ......, [On Hand] AS OnHand......

Это действительно работает и, как представляется, правильно извлекает данные, однако я не думаю, что это очень красивая или хорошая практика.

Поэтому, если у кого-то есть более элегантное решение для этого или для вызова функции, то, пожалуйста, дайте мне знать, поскольку я всегда стараюсь улучшить свой код и наши стандарты.

Смежные вопросы