Как указывает Даниэль, таблицу можно связать с одним определением сущности, вне наследования Table Per Hierarchy, а это не то, что вы ищете.
Это был старый прием, который я использовал сNHibernate, который не поддерживается в EF.
С EF вы можете использовать Linq и ViewModels, чтобы избежать необходимости в облегченных и полных моделях.
Дано:
//Entity
public class User
{
public int ID {get;set;}
public string Name {get;set;}
public int firstName{get;set;}
public date dateofBrith {get;set;}
public string password {get;set;}
public string email {get;set;}
public string address {get;set;}
}
// View Models...
public class LiteUserViewModel
{
public int ID {get;set;}
public string Name {get;set;}
public int firstName{get;set;}
}
public class FullUserViewModel : LiteUserViewModel
{
public date dateofBrith {get;set;}
public string password {get;set;}
public string email {get;set;}
public string address {get;set;}
}
Запрос ..
//Give me a list of lite data..
var viewModels = context.Users
.Where(x => x.DateOfBirth < startDate)
.Select(x => new LiteUserViewModel
{
UserId = x.UserId,
Name = x.Name,
FirstName = x.FirstName
}).ToList();
// Give me a full user.
var viewModel = context.Users
.Where(x => x.UserId = userId)
.Select(x => new FullUserViewModel
{
UserId = x.UserId,
// ... etc ...
}).SingleOrDefault();
Вы можете использовать библиотеки, такие как AutoMapper, для обработки сопоставления сущности для просмотра модели.В тех случаях, когда вы просто хотите проверить данные, вам не нужно определять модель представления / DTO, просто используйте анонимный тип.Конечный результат тот же, что EF выполнит оптимизированный запрос, чтобы просто вернуть нужные данные, а не целые объекты.Вы можете оптимизировать модели представления для выравнивания иерархических данных, используя эту технику.Вам нужно убедиться, что все методы или преобразования в .Select()
являются чистыми и EF-совместимыми, потому что EF попытается преобразовать и передать их в SQL.Более сложные преобразования следует выполнять в самой модели представления или использовать выбор необработанных данных анонимным типом, за которым следует ToList / Single / и т. Д.затем .Select () в модель представления с соответствующими преобразованиями через Linq2Object.