EntityFreamwork полная сущность и облегченная сущность - PullRequest
0 голосов
/ 04 октября 2018

у меня есть пользователи таблицы

таблица пользователей:

Id, имя, имя, пароль, адрес электронной почты, адрес, dateofBrith

я хочу создать два объекта для таблицы пользователяодна облегченная и другая полная

[Table("user")]
public class LiteUser 
{
   public int ID {get;set;}
   public string Name {get;set;}
   public int firstName{get;set;}
} 

вторая сущность

public class fullUser : LiteUser
{   
       public date dateofBrith {get;set;}
       public string password {get;set;}
       public string email {get;set;}
       public string address {get;set;}

}

но я не получаю ошибку о том, что никакой дискриминатор столбца

невозможно сделатьчто-то вроде моей сущности такое же, но одна подала больше, чем другая сущность

Заранее спасибо за помощь

Ответы [ 4 ]

0 голосов
/ 05 октября 2018

Один из вариантов - использовать разбиение таблицы, когда вы сопоставляете одну таблицу с двумя или более объектами.Разница с вашим запрошенным решением заключается в том, что «дополнительные» свойства в «полной» конфигурации будут представлены другим типом объекта.Пример (для EF Core; EF6 будет очень похож):

public class SplitTablePrincipal
{
    [Key]
    public int Id { get; set; }
    public string PrincipalProperty { get; set; }
    // principal entity has a nav property to the dependent entity
    public virtual SplitTableDependent Dependent { get; set; }
}

public class SplitTableDependent
{
    [Key]
    public int Id { get; set; }
    public string DependentProperty { get; set; }
}

public class SplitTablePricipalConfiguration : IEntityTypeConfiguration<SplitTablePrincipal>
{
    public void Configure( EntityTypeBuilder<SplitTablePrincipal> builder )
    {
        //builder.HasKey( pe => pe.Id );
        // establish 1:? relationship w/ shared primary key
        builder.HasOne( pe => pe.Dependent )
            .WithOne()
            .HasForeignKey<SplitTableDependent>( de => de.Id ); // FK is PK
        builder.ToTable( "YourTableName" );
    }
}

public class SplitTableDependentConfiguration : IEntityTypeConfiguration<SplitTableDependent>
{
    public void Configure( EntityTypeBuilder<SplitTableDependent> builder )
    {
        //builder.HasKey( de => de.Id );
        // map dependent entity to same table as principal
        builder.ToTable( "YourTableName" ); // same table name
    }
}

Вам нужно только включить DbSet для SplitTablePrincipal типа сущности в вашем DbContext.При запросе свойство Dependent не будет заполнено по умолчанию (ваша «облегченная» конфигурация);вам нужно будет загрузить свойство для «полной» конфигурации данных через .Include( stp => stp.Dependent ).Вы также можете лениво загрузить или явно загрузить свойство Dependent дальше по линии, если захотите.Например:

dbContext.Entry( principalEntity ).Reference( p => p.Dependent ).Load();
0 голосов
/ 04 октября 2018

Вы можете сделать что-то вроде этого

[Table("user")]
public class LiteUser 
{
   public string Name {get;set;}
   public int firstName{get;set;}
}

public class fullUser : LiteUser
{   
   public int ID {get;set;}
   public date dateofBrith {get;set;}
   public string password {get;set;}
   public string email {get;set;}
   public string address {get;set;}

}

Использовать значение первичного ключа public int ID {get;set;} в производном классе

0 голосов
/ 05 октября 2018

Как указывает Даниэль, таблицу можно связать с одним определением сущности, вне наследования 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.

0 голосов
/ 04 октября 2018

К сожалению, нет.Вы можете определить только одну сущность для одной таблицы.Вместо этого вам нужно будет выполнить ручное управление. Выберите полную сущность, чтобы вернуть настраиваемую запись «Lite», потому что EF нужно знать все столбцы, которые связаны с конкретной таблицей с самого начала.

Редактировать: Единственный способ обойти это - создать вид и сопоставить его с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...