2012-01-18 30 views
5

Tôi có một mô hình như sau:Entity Framework Mã Đệ Nhất - Bỏ qua Base Class

public class User : System.Web.Security.MembershipUser 
{ 
public int UserId { get; set; } 
    public string SomeProperty { get; set; } 
} 

Khi cơ sở dữ liệu của tôi được tạo ra tôi muốn khung Entity để bỏ qua MembershipUser và chỉ tạo ra một bảng tên người dùng với hai thuộc tính từ lớp User. Tôi đã thử những điều sau đây không có kết quả.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Ignore<System.Web.Security.MembershipUser>(); 
} 
+0

gì là sai với modelBuilder.Ignore ()? Nó không hoạt động? – vk5880

Trả lời

2

NotMappedAttribute thuộc tính là bạn của bạn:

[MetadataType(typeof(UserMd)] 
public class User : System.Web.Security.MembershipUser 
{ 
    ////read description bellow code 
    //static User() 
    //{ 
    // var type = typeof(User); 
    // TypeDescriptor.AddProviderTransparent(
    // new AssociatedMetadataTypeTypeDescriptionProvider(type), type); 
    //}   

    public int UserId { get; set; } 
    public string SomeProperty { get; set; } 

    internal class UserMd 
    { 
     [NotMapped] 
     public string UserName { get; set; } 
    } 
} 

Tôi không chắc chắn nếu mã đầu tiên xử lý siêu dữ liệu tự động bằng cách riêng của mình, hãy thử trên, và nếu nó không hoạt động, đính kèm các siêu dữ liệu thủ công (tức là bỏ ghi chú các dòng nhận xét).

Cập nhật tôi làm như giải pháp trên tốt hơn, nhưng nếu nó quá dài dòng cho bạn, sử dụng các phương pháp StructuralTypeConfiguration<TStructuralType>.Ignore<TProperty> Method:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    var config = modelBuilder.Entity<User>(); 
    config.Ignore(u => u.UserName); 
} 
+0

@MystereMan xin lỗi, câu trả lời đã được cập nhật. – Shimmy

+0

Khi được sử dụng với hàm dựng tĩnh, công trình này hoạt động. Khá xấu xí mặc dù. Tôi rất muốn thấy một giải pháp thanh lịch hơn nếu có. – Mark

+0

OK. Tôi đã chỉnh sửa câu trả lời của mình. – Shimmy

8

Có hai lựa chọn cho bạn. Một là bỏ qua tất cả các thuộc tính lớp cơ sở bằng cách gọi Ignore cho mỗi thuộc tính.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>().Ignore(u => u.ProviderUserKey); 
    modelBuilder.Entity<User>().Ignore(u => u.LastActivityDate); 
    // and so on for all base class properties 
} 

tùy chọn khác sẽ được sử dụng thành phần để lấy một ví dụ MembershipUser từ lớp User của bạn. Ở đây User lớp không được thừa hưởng từ MembershipUser.

public class User 
{ 
    public int UserId { get; set; } 
    public string SomeProperty { get; set; } 

    public MembershipUser MembershipUser 
    { 
     get 
     { 
      // create an instance using the available properties and return 
     } 
    } 
} 

Và bản đồ như sau

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>().Ignore(u => u.MembershipUser); 
    modelBuilder.Ignore<System.Web.Security.MembershipUser>(); 

} 
+0

Tôi thường đồng ý với mẹo để ưu tiên thừa kế thành phần. – Suamere

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