Это невозможно. Вы злоупотребляете наследованием сущностей.
Прежде всего, у вас никогда не будет TPH без столбца дискриминатора, потому что у вас никогда не будет двух сущностей, сопоставленных с одной и той же записью базы данных. Это означает, что ваша запись в базе данных может быть только User
или UserFull
, но никогда не быть обоими.
Вы должны различаться между объектом и моделью представления. Эти двое не одинаковы. Сущность - это то, что вы хотите сохранить, и это полный сбор данных. Модель представления - это подмножество одной или нескольких сущностей, представленных в представлении.
В вашем случае наиболее очевидным решением является класс User
со всеми полями и запросом проекции для настраиваемого неотображенного представления для ограниченного просмотра пользователем.
Сопоставленная сущность и модель полного вида:
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Street { get; set; }
public string Country { get; set; }
}
Модель ограниченного вида без сопоставления:
public class UserLimitedView
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Отображение:
public class theDBtoUse : DbContext
{
public DbSet<User> User { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().Property(r => r.Id).HasColumnName("user_id");
modelBuilder.Entity<User>().Property(r => r.FirstName).HasColumnName("user_firstname");
modelBuilder.Entity<User>().Property(r => r. LastName).HasColumnName("user_lastname");
modelBuilder.Entity<User>().Property(r => r.Street).HasColumnName("user_street ");
modelBuilder.Entity<User>().Property(r => r.Country).HasColumnName("user_country");
base.OnModelCreating(modelBuilder);
}
}
Запрос:
var data = context.Users
.Where(...)
.Select(u => new UserLimitedView
{
Id = u.Id,
FirstName = u.FirstName,
LastName = u.LastName
});
var fullData = context.Users.Where(...);
Во-первых, EF-код не имеет встроенной поддержки отображения для непосредственного отображения проекций. В случае EDMX проекции могут быть частью отображения через QueryView.