Entity Framework 4 - Обрезать значение Char (50) базы данных для Name в устаревшей базе данных - PullRequest
3 голосов
/ 23 марта 2011

Это должно быть просто, но я пока не нашел пути ...

У меня есть устаревшая база данных с полями имен, которые хранятся как CHAR (50). Когда это связано с TextBox с максимальной длиной 50, вы не можете вставить.

Как заставить EF обрезать эти значения или, по крайней мере, отобразить в RTrim (Column)?

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

Обратите внимание, что я хочу обрезать только некоторые поля, а не все.

Мы используем SQL Server 2000 в качестве базы данных. Скоро перейти на SQL 2008.

Спасибо!

Ответы [ 3 ]

1 голос
/ 25 марта 2011

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

Я думаю, что описанная вами проблема связана с поведением ANSI PADDING. Может быть включен, но:

  • Не рекомендуется. В будущей версии SQL-сервера это будет считаться ошибкой.
  • Должен быть настроен до создания столбца

Вы должны обрабатывать обрезку в приложении. Например, вы можете изменить шаблон T4 (если вы его используете), чтобы обрезать строковые свойства. Не уверен, как он работает с WPF, но вы, вероятно, можете унаследовать текстовое поле и переопределить свойство Text, чтобы обрезать значения.

Другим способом является обработка события ObjectMaterialized для ObjectContext и ручная обрезка свойств текста, но это может замедлить выполнение ваших запросов.

1 голос
/ 04 апреля 2011

Нет способа сделать это с EF и SQL Server, которые я обнаружил. Я решил это с помощью метода расширения на IEnumerable<T>, который вызывает TrimEnd() для каждого string свойства:

    public static IEnumerable<TEntity> Trim<TEntity>(this IEnumerable<TEntity> collection)
    {
        Type type = typeof(TEntity);

        IEnumerable<PropertyDescriptor> properties = TypeDescriptor.GetProperties(type).Cast<PropertyDescriptor>()
            .Where(p => p.PropertyType == typeof(string));

        foreach (TEntity entity in collection)
        {
            foreach (PropertyDescriptor property in properties)
            {
                string value = (string) property.GetValue(entity);

                if (!String.IsNullOrEmpty(value))
                {
                    value = value.TrimEnd();
                    property.SetValue(entity, value);
                }
            }
        }

        return collection;
    }

Просто убедитесь, что вы вызываете его после того, как EF извлекает сущности из базы данных. Например, после ToList ():

    public IEnumerable<Country> FetchCountries()
    {
        return _context.Set<Country>().ToList().Trim();
    }
0 голосов
/ 24 марта 2011

Посмотрите доступные атрибуты для вашей строки подключения к базе данных.У меня была похожая проблема с базой данных Sybase Advantage, и я решил ее с помощью атрибута TrimTrailingSpaces.Ваша база данных может поддерживать что-то подобное.

Data Source=\\serverx\volumex\path\db.add;User ID=user;Password=pass;ServerType=REMOTE;TrimTrailingSpaces=TRUE;

http://www.connectionstrings.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...