Изменение столбца дискриминатора на int в Entity Framework 4.1 - PullRequest
5 голосов
/ 05 мая 2011

Это моя ситуация, очень упрощенная.

Мои занятия;

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, чтобы хотя бы минимизировать это. При этом я говорю, что у нас очень аккуратная иерархия классов, но ужасный набор запросов.

Ответы [ 2 ]

5 голосов
/ 24 марта 2012

Поздний ответ, как пошло фактическое решение. Только записать это здесь, потому что документацию вокруг этого было не так легко найти.

Мое решение закончилось как показано ниже ...

modelBuilder.Entity<ClassBase>()
        .Map(m => {
            ...
            m.Requires("Discriminator").HasValue(1)
        });
1 голос
/ 05 мая 2011

По поводу вашего "невероятно большого запроса к базе данных": действительно, проблемы производительности и генерации запросов с отображением наследования TPT .Кажется, до сих пор нет решения этих проблем, только это расплывчатое объявление (август 2010 г.):

Хорошая новость заключается в том, что мы работаем над этими проблемами, чтобы EF больше не генерировал ненужныхSQL.Плохая новость заключается в том, что пройдет некоторое время, прежде чем исправление будет выпущено в следующем выпуске.

(Цитата из приведенной выше статьи.)

...