Entity Framework Code First - игнорировать базовый класс - PullRequest
6 голосов
/ 18 января 2012

У меня есть следующая модель:

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

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

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

Ответы [ 2 ]

8 голосов
/ 18 января 2012

Есть два варианта для вас. Один из них - игнорировать все свойства базового класса, вызывая 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>();

}
2 голосов
/ 18 января 2012

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

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

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

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