Это моя ситуация, очень упрощенная.
Мои занятия;
public class ClassBase
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
public class ClassMiddle1 : ClassBase
{
}
public class ClassMiddle2 : ClassBase
{
public Guid Token { get; set; }
}
public class ClassA : ClassMiddle1
{
public string UserId { get; set; }
public string Username { get; set; }
}
public class ClassB : ClassMiddle2
{
public string Username { get; set; }
}
И мой OnModelCreating;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ClassBase>()
.Map(m => {
m.Properties(p => new { p.Id});
m.ToTable("TableBase");
});
modelBuilder.Entity<ClassMiddle1>()
.Map<ClassMiddle1>(m =>
{
m.Properties(p => new { });
m.ToTable("TableBase");
});
modelBuilder.Entity<ClassMiddle2>()
.Map<ClassMiddle2>(m =>
{
m.Properties(p => new { p.Token });
m.ToTable("TableBase");
});
modelBuilder.Entity<ClassA>()
.Map<ClassA>(m =>
{
m.Properties(p => new
{
p.UserId,
p.Username
});
m.ToTable("TableA");
});
modelBuilder.Entity<ClassB>()
.Map<ClassB>(m =>
{
m.Properties(p => new
{
p.Username
});
m.ToTable("TableB");
}).Property(p => p.Username).HasColumnName("User");
}
Это работает нормально, но столбец Дискриминатор по умолчанию является Дискриминатором, NVARCHAR (128). Я прочитал, что можно определить этот столбец самостоятельно, используя что-то вроде ниже.
m.Requires("ClassType").HasValue(1);
Я вывернул свои возможности наизнанку, но все время заходил в тупик. У кого-нибудь есть предложения, как это сделать?
Я закончу другим вопросом. Поскольку наша иерархия в значительной степени такая же, как и выше, но даже более производные классы, такие как C, D, E, F и т. Д., Скажем, P. Мы обнаружили, что EF выполняет этот невероятно большой запрос к базе данных (~ 150 КБ). Кто-нибудь еще сталкивался с этим сценарием?
Я надеюсь изменить Discriminator, чтобы хотя бы минимизировать это. При этом я говорю, что у нас очень аккуратная иерархия классов, но ужасный набор запросов.