2009-10-08 34 views
12

Tôi đang thử triển khai Ghi chú dữ liệu cho các đối tượng LINQ to SQL của tôi. Tệp .dbml được tạo và tôi không chắc chắn cách thêm chú thích dữ liệu vào các đối tượng mà không cần chạm vào mã nguồn được tạo.ASP.NET MVC, LINQ to SQL Data Annotation Validation

Tôi đã cố thêm chú thích dữ liệu vào một lớp riêng biệt của đối tượng, nhưng nó không nhận ra nó, không có ý nghĩa Intelli.

Trả lời

22

Như tôi đã nói trong câu trả lời ban đầu cho câu hỏi này, bạn nên sử dụng giao diện. Câu trả lời được đăng sau khi tôi (được đánh dấu là Được chấp nhận) cho biết sử dụng một lớp học. Điều này không tốt.Một giao diện là một lựa chọn tốt hơn vì những lý do sau đây:

  • Nếu có sự không phù hợp giữa tên trong lớp LINQ của bạn và tên trong giao diện của bạn, trình biên dịch sẽ cờ đó cho bạn
  • một giao diện có thể không được khởi tạo, vì vậy đây bảo vệ người dùng lớp vô tình instatntiating các loại siêu dữ liệu
  • Nếu bạn sử dụng Resharper (hoặc tương tự), giao diện có thể được tự động chiết xuất từ ​​lớp LINQ
  • một giao diện là ít tiết hơn một lớp rỗng
  • Nếu bạn lập trình chống lại int erfaces thay vì các lớp (thực hành tốt), sau đó bạn đã có giao diện mà bạn có thể sử dụng làm loại siêu dữ liệu của mình

Đối với một lớp được gọi là "Người dùng", hãy tạo giao diện cho nó (nói 'IUser'), và sau đó cập nhật các định nghĩa của lớp người dùng cục bộ của bạn như sau:

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

sau đó, trong giao diện IUser của bạn, thêm thuộc tính Chú dữ liệu phù hợp với tính chất:

[Required]  
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")] 
string Username { get; set; } 
+1

Tôi thực sự thích cách tiếp cận này, ngoại trừ tôi không thể thêm thuộc tính [Bind (Exclude = "ID")] vào giao diện, vì vậy tôi phải đặt nó trên lớp học. Điều đó có hiệu quả, nhưng siêu dữ liệu hiện được phân chia giữa lớp và giao diện. – palmsey

+0

Nhưng tôi nên làm gì nếu tôi có thêm một số trường trong mô hình của mình? Ví dụ, tôi có thêm trường 'Confirm Password'. Nếu tôi đặt trường này trong trình biên dịch giao diện sẽ không vượt qua điều này vì không có trường như vậy trong lớp cơ sở LINQ to SQL. – kseen

+0

Nhưng làm cách nào để tự động tạo các thuộc tính này? Dbml có mọi thứ cần thiết để tạo ra chúng. Tôi có 20 bảng với hàng tá cột trong mỗi ... Tôi sẽ không cố gắng duy trì điều đó theo cách thủ công. Có ai có giải pháp không? –

9

Đối với một lớp được gọi là, nói "Người sử dụng", tạo ra một giao diện cho nó (nói 'IUser'), và sau đó cập nhật các định nghĩa của lớp người dùng cục bộ của bạn như sau:

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

Sau đó, trong bạn Giao diện IUser, thêm thuộc tính Chú thích dữ liệu thích hợp vào các thuộc tính:

[Required]  
[StringLength(50, ErrorMessage = "Username cannot exceed 50 characters")] 
string Username { get; set; } 
6

LINQ to SQL tạo lớp đối tượng là một phần. Một cách dễ dàng để thực hiện chú thích dữ liệu là tạo ra một phần lớp riêng của đối tượng, đặt [MetadataType (typeof (YourDataAnnotationClass))] trên lớp partial bạn đã tạo.

Ví dụ:

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

Tạo lớp MetaData của riêng bạn với Metadata cho từng lĩnh vực bạn muốn xác

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

Tạo một lớp học phần cho các lớp đối tượng mà bạn muốn thêm siêu dữ liệu để, trong trường hợp này Bài viết lớp học:

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

Lưu ý: bạn không cần phải chỉ định bất cứ điều gì trong lớp, chỉ loại siêu dữ liệu.

+0

baddie, bạn thiếu độ rõ ràng –

2

Cảm ơn, nhưng vấn đề là M S xác định nguyên mẫu của MetadataTypeAttrubute như

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

Vì vậy, bạn phải sử dụng lớp nhưng không giao tiếp


Từ Trung Quốc Forest Lee: 李晓强 [email protected] (MSN) lixiaoqiang @ webservice.com.cn

+1

Nó hoạt động ngay cả với giao diện bất kể định nghĩa nói gì. –

+0

Tôi không thể làm cho nó hoạt động không phải là giao diện cũng không phải lớp: (Im cố gắng thêm IgnoreDataMember vào một số Thuộc tính được tạo tự động của các lớp một phần của tôi trong dự án WCF –