Как получить длину строки для поля на стороне сервера? - PullRequest
4 голосов
/ 07 февраля 2012

У меня есть модель edmx, созданная из базы данных, и metadata.cs для нее.

В клиенте .g.cs включает [StringLength(X)] атрибуты наряду с моими атрибутами из моих метаданных.

Я выполняю некоторые проверки на стороне сервера для импорта плоских файлов, который отделен от редакторов этих объектов на стороне клиента.

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

Изменить:

Вот код:

Файл на стороне сервера ProductService.metadata.cs:

internal sealed class PRODUCTMetadata
{
  [Required]
  [RegularExpression("[A-Z]+")]
  [Display(Name = "Product Code", Order = 10)]
  public string Product_code { get; set; }
}

Клиентская сторона Generated_Code \ NameSpace.Web.g.cs:

public sealed class PRODUCT
{
  [DataMember()]
  [Display(Name="Product Code", Order=10)]
  [RegularExpression("[A-Z]+")]
  [Required()]
  [StringLength(8)] //This is what I want to know, but server side
  public string Product_code
  {...etc
  }
}

1 Ответ

2 голосов
/ 09 февраля 2012

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

Как вы уже видели, автоматически сгенерированный код клиентского прокси-сервера гораздо больше украшен атрибутами, чем код на стороне сервера.Например, ваши сущности имеют приятный атрибут [StringLength(8)], полученный из модели сущностей.На стороне сервера автоматически сгенерированный файл .metadata.cs не имеет этих атрибутов на объектах. Я думаю, что это все о шаблонах генерации кода .

Я подозреваю, что шаблон генерации кода RIA Services (который создает файл .g.cs) гораздо более полный, чем шаблон, который создаетфайл .metadata.cs на стороне сервера.

Тот факт, что атрибут, отсутствующий в вашем случае, составляет 95% времени, используемого для проверки пользовательского интерфейса на стороне клиента, может объяснить, почему шаблон для файла .metadata.csне производит эти проверки атрибуты.

Я вижу 2 обходных пути для вашей проблемы:

1.Напишите свой собственный класс метаданных на стороне сервера

Пример:

[MetadataTypeAttribute(typeof(PRODUCT.PRODUCTMetadata))]
public partial class PRODUCT
{
    internal sealed class PRODUCTMetadata
    {
        // Metadata classes are not meant to be instantiated.
        private PRODUCTMetadata()
        {
        }

        [StringLength(8)]
        public string Product_code { get; set; }
    }
}

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

К сожалению, вам придется поддерживать эти метаданные каждый раз, когда вы изменяете свою модель: если (например) столбец таблицы БД изменится с varchar(8) на varchar(10), вы сможете автоматически обновлять своиМодель EDMX из вашей базы данных, но вам придется вручную проверить, что ваши метаданные все еще в порядке (в этом примере вам придется вручную заменить [StringLength(8)] на [StringLength(9)]).

Вот хорошая ссылка о метаданных.

2.Модификация шаблонов T4

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

Шаблоны генерации кода известны как шаблоны T4 ( Инструментарий преобразования текстовых шаблонов ).Можно изменить эти шаблоны, чтобы включить в процесс генерации кода все, что вы хотите.Вы можете изменить шаблон EF по умолчанию, чтобы он генерировал отсутствующие атрибуты, как это делает шаблон RIA Services.

Вот несколько хороших статей о генерации кода T4:


Я пишу это как ответ (это не подходит как комментарий), , но помнитеэто все предположения .

...