0

У меня есть класс Tenant, который наследуется от . Я использую таблицы в-типа наследования, так мой контекст класса выглядит следующим образом:Использование хранилища лесов для MVC с унаследованными классами (таблица за тип) не работает

// 1 DbSet for superclass UserProfile 
public DbSet<LetLord.Models.UserProfile> UserProfile { get; set; } 

Я использую классы хранилища для моего доступа к данным и я создал TenantRepository с помощью следующей команды менеджера пакетов:

Эшафот контроллер Арендатором -Repository

Когда я пытаюсь запустить мое приложение, все ссылки на Арендатор в TenantRepository бросить следующее сообщение об ошибке ...

«MyNamespace.MyContext» не содержит определения «Арендатор» и никакого расширения для «Арендатора», принимающего первый аргумент «MyNamespace.MyContext».

... такие как следующей ссылке:

public IQueryable<Tenant> All 
{ 
    get { return context.Tenant; } // error line here 
} 

При использовании таблицы в-типа наследования только DbSet для базовых классов должны быть включены, так что я понимаю, почему я получаю сообщение об ошибке ,

Как использовать репозитории с производными классами, реализованными в таких сценариях, как мой?


EDIT

Как выше достигается при использовании .Add(), .Find(), .Remove() и т.д.?

же ошибка, как описано выше для ранее упомянутых методов:

public Tenant Find(int id) 
{ 
    return context.UserProfile.OfType<Tenant>().Find(id); // error at .Find() 
} 

ответ

1

Попробуйте это:

public IQueryable<Tenant> All 
{ 
    get { return context.UserProfile.OfType<Tenant>(); } 
} 

Это будет возвращать только Арендаторы.

Для других методов, таких как добавление, Найти, Удалить:

public Tenant Find(int id) 
{ 
    // a few different options here -- assumes your key property is Id 
    return context.UserProfile.OfType<Tenant>().SingleOrDefault(t => t.Id == id); 

    // option 2 
    // even though your context does not expose a DbSet<Tenant>, you can still 
    // use the Set<TResult>() method to get only tenants this way 
    return context.Set<Tenant>().Find(id); 
} 

public void Add(Tenant tenant) 
{ 
    context.Add(tenant); 
} 

public void Remove(Tenant tenant) 
{ 
    context.Set<Tenant>().Remove(tenant); 
} 
+0

Спасибо, что работает, но смотрите редактировать RE другие хранилища методов. – MattSull

+0

Я не знаю, как выглядят эти методы, но я дам ему шанс. – Dismissile

+0

Они являются частью класса репозитория, который автоматически создается при запуске команды диспетчера пакетов, описанной в вопросе. – MattSull