ASP.NET MVC, проверка аннотаций данных Linq to SQL - PullRequest
12 голосов
/ 08 октября 2009

Я пытаюсь реализовать аннотацию данных к моим объектам Linq to SQL. Файл .dbml создан, и я не уверен, как добавить аннотацию данных к объектам, не касаясь сгенерированного исходного кода.

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

Ответы [ 4 ]

22 голосов
/ 13 октября 2009

Как я уже говорил в моем первоначальном ответе на этот вопрос, вы должны использовать интерфейс. Ответ, опубликованный после моего (который был помечен как принятый), сказал, чтобы использовать класс. Это не так хорошо. Интерфейс является лучшим вариантом по следующим причинам:

  • Если существует несоответствие между именем в вашем классе LINQ и именем в вашем интерфейсе, компилятор пометит его для вас
  • Интерфейс не может быть создан, поэтому это защищает пользователей класса от случайного создания экземпляра типа метаданных
  • Если вы используете Resharper (или аналогичный), интерфейс может быть автоматически извлечен из класса LINQ
  • Интерфейс менее многословен, чем пустой класс
  • Если вы программируете с использованием интерфейсов, а не классов (что является хорошей практикой), то у вас уже есть интерфейс, который вы можете использовать в качестве типа метаданных

Для класса, называемого «Пользователь», создайте для него интерфейс (например, «IUser»), а затем обновите определение вашего частичного класса «Пользователь» следующим образом:

[MetadataType(typeof(IUser))]
public class User : IUser

Затем в своем интерфейсе IUser добавьте соответствующие атрибуты аннотации данных к свойствам:

[Required]       
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")]
string Username { get; set; }
9 голосов
/ 11 октября 2009

Для класса, называемого «Пользователь», создайте для него интерфейс (например, «IUser»), а затем обновите определение вашего частичного класса «Пользователь» следующим образом:

[MetadataType(typeof(IUser))]
public class User : IUser

Затем в своем интерфейсе IUser добавьте соответствующие атрибуты аннотации данных в свойства:

[Required]       
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")]
string Username { get; set; }
6 голосов
/ 11 октября 2009

Linq to SQL генерирует классы объектов как частичные. Простой способ реализовать аннотации данных - создать собственный частичный класс объекта, поместив [MetadataType (typeof (YourDataAnnotationClass))]] в созданный вами частичный класс.

Пример:

// Linq to SQL Class
public partial class Article 
{
   public string Title { get; set; }
   ...... etc
}

Создайте свой собственный класс MetaData с метаданными для каждого поля, которое вы хотите проверить

public class MyMetaDataClass
{
    [Required]
    [Range(5,20)]
    public string Title { get; set; }
}

Создайте частичный класс для класса Object, к которому вы хотите добавить метаданные, в данном случае для класса Articles:

[MetadataType(typeof(MyMetaDataClass))]
public partial class Article { }

Примечание: вам не нужно ничего указывать в классе, только тип метаданных.

2 голосов
/ 26 ноября 2009

Спасибо, но проблема в том, что MS определяет прототип MetadataTypeAttrubute как

[AttributeUsageAttribute(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
public sealed class MetadataTypeAttribute : Attribute

Итак, вы должны были использовать класс, но не интерфейс


из Китая Форест Ли: 李晓强 xiaoqianglinsen@163.com (MSN) lixiaoqiang@webservice.com.cn

...