7

Tôi đang sử dụng Entity Framework 5 trong Cơ sở dữ liệu Phương pháp tiếp cận đầu tiên và tôi đang sử dụng tệp edmx.Lớp cơ bản/Thực thể trong EntityFramework 5.0

Hầu hết các pháp nhân của tôi có 6 trường phổ biến. Các trường như CreatedAt, CreatedBy vv Bây giờ, tôi đã triển khai một số chức năng dưới dạng tiện ích mở rộng chỉ có thể được áp dụng cho IQueryable của những Thực thể có các trường chung. Nhưng khi tôi thực hiện phương pháp mở rộng, nó có thể được truy cập bởi bất kỳ loại IQueryable vì nó được gõ T và tôi chỉ có thể xác định rằng loại T phải luôn luôn là một loại.

Vì vậy, tôi nghĩ rằng tôi có thể cung cấp một lớp cơ sở cho các thực thể có các trường chung và xác định loại T làm loại cơ sở đó. Nhưng, có vẻ như tôi không thể làm điều này.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này hoặc thực hiện những gì tôi đã giải thích ở trên?

Trả lời

8

Không tạo lớp cơ sở. Tạo một giao diện như bên dưới:

public interface IMyEntity 
{ 
    DateTime CreatedAt { get; set; } 
    string CreatedBy { get; set; } 
    // Other properties shared by your entities... 
} 

Sau đó, mô hình của bạn sẽ như thế này:

[MetadataType(typeof(MyModelMetadata))] 
public partial class MyModel : IMyEntity 
{ 
    [Bind()] 
    public class MyModelMetadata 
    { 
     [Required] 
     public object MyProperty { get; set; } 

     [Required] 
     public string CreatedBy { get; set; } 
    } 
} 
+0

Cảm ơn phản hồi nhanh chóng của bạn. Vì vậy, nếu tôi xác định giao diện bên ngoài tệp edmx. sau đó tôi sẽ nói với thực thể để thực hiện từ giao diện đó. Không dễ dàng chỉnh sửa thủ công tất cả các thực thể được yêu cầu vì tôi sẽ phải thực hiện lại lần nữa khi tôi cập nhật tệp edmx. – Amila

+2

Bạn không chạm vào mã được tạo tự động. Đó là những gì các lớp học một phần được cho là được sử dụng cho. Bạn tạo một lớp một phần (trong thư mục Models) cho mỗi thực thể của bạn trong EF. Đó là nơi bạn có thể xác định một MetadataType cho Mô hình của bạn (để chú thích dữ liệu). Xem câu trả lời được cập nhật. – ataravati

+0

Có, tôi đang sử dụng MetadataType tại thời điểm này. Nhưng nghĩ rằng có thể có một cách dễ dàng để làm điều đó, tức là giống như đưa ra một lớp cơ sở cho một thực thể, nó sẽ tốt hơn nếu nó được phép đưa ra một giao diện cũng như trong sơ đồ. Dù sao, nó loos như tôi sẽ phải xác định các lớp một phần cho tất cả các thực thể. Cảm ơn bạn đã giúp đỡ nhanh chóng – Amila

2

Tôi là một fan hâm mộ của:

public interface IShared 
{ 
    DateTime CreatedOn { get; set; } 
} 

public interface ISharedValidation 
{ 
    [Required] 
    DateTime CreatedOn { get; set; } 
} 


public interface IMyEntity: IShared 
{ 
    // Entity Specifics 
    string Username { get; set; } 
} 

public interface IMyEntityValidation: ISharedValidation 
{ 
    [Required] 
    string Username { get; set; } 
} 

Sau đó, mô hình của bạn sẽ được như thế này:

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
    public object CreatedOn { get; set; } 
    public string Username { get; set; } 
} 

Nếu T4 chi ted bởi Entity Framework thì phi autogenerated lớp học của bạn sẽ trông như thế:

[MetadataType(typeof(IMyEntityValidation))] 
public partial class MyModel : IMyEntity 
{ 
} 

Thông thường, it is not recommended to use Bind in Asp.Net MVC.

Các vấn đề liên quan