У меня проблема с реализацией иерархии данных в EF Core 3.0 (мне нужно использовать TPH).
Давайте посмотрим:
public abstract class User
{
public Guid Id { get; set; }
public string Name { get; set; }
public abstract UserProfile **Profile** { get; set; }
}
public class ConcreteUser1 : User
{
public string ConcreteUser1Prop { get; set; }
public override UserProfile Profile { get; set; }
}
public class ConcreteUser2 : User
{
public string ConcreteUser2Prop { get; set; }
public override UserProfile Profile { get; set; }
}
И вот у нас Profile
классы:
public class UserProfile
{
public Guid Id { get; set; }
public string SameProp { get; set; }
public Guid UserId { get; set; }
public User User { get; set; }
}
public class ConcreteUser1Profile : Profile
{
public string ConcreteProfile1Prop { get; set; }
}
public class ConcreteUser2Profile : Profile
{
public string ConcreteProfile2Prop { get; set; }
}
Пусть это будет только один DbSet<User>
, который можно использовать для получения данных из базы данных. Итак, я не могу понять, как сказать EF Core (3.0) 2 вещи: как сказать, чтобы хранить ConcreteUser*Profile
(возможно, Add
и SaveChanges
будет работать правильно и писать конкретный тип профиля, когда я добавляю конкретный типпользователь с конкретным типом профиля, но я не знаю, как сказать EF Core, чтобы получить правильный тип конкретного профиля, когда я использую Where
или FirstOrDefault
метод? Является ли эта модель правильной в принципе?
UpdНапример, у меня есть две записи в моей базе данных: ConcreteUser1 user1
, ConcreteUser2 user2
. Итак, давайте получим DbSet<User> Users
, так что у меня будет после запроса: var tstUser = ExampleDbContext.Users.FirstOrDefault();
? Что будет тип переменной Profile вtstUser.Profile