2012-01-18 2 views
5

У меня есть модель выглядит следующим образом:Entity Framework Code First - игнорировать базовый класс

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

Когда моя база данных генерируется я хочу Entity Framework игнорировать MembershipUser и только создать таблицу с именем пользователя с двумя свойствами из класс пользователя. Я пробовал следующее безрезультатно.

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

, что случилось с modelBuilder.Ignore ()? Это не сработало? – vk5880

ответ

2

NotMappedAttribute атрибут является вашим другом:

[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; } 
    } 
} 

Я не уверен, если код первого автоматически обрабатывает метаданные самостоятельно, попробуйте выше, и если он не работает, установите метаданные вручную (т.е. раскомментировать прокомментированные строки).

Update я как выше решение лучше, но если он слишком многословен для вас, используйте StructuralTypeConfiguration<TStructuralType>.Ignore<TProperty> Method метод:

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

@MystereMan извините, ответьте обновлен. – Shimmy

+0

При использовании со статическим конструктором это работает. Довольно уродливый. Мне бы хотелось увидеть более элегантное решение, если оно существует. – Mark

+0

ОК. Я отредактировал свой ответ. – Shimmy

8

Есть два варианта для вас. Один из них - игнорировать все свойства базового класса, вызывая Ignore для каждого свойства.

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 
} 

Другой вариант должен был бы использовать состав для извлечения MembershipUser экземпляр из вашего User класса. Здесь User класс не унаследован от 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 
     } 
    } 
} 

И карта следующего

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

} 
+0

Я часто соглашаюсь с подсказкой «Предпочитаю композицию над наследованием». – Suamere

Смежные вопросы