TPH без других полей базы данных в производном классе в Entity Framework 4.1 - PullRequest
2 голосов
/ 04 августа 2011

Это моя (упрощенная) проблема.Классы:

public class RetailExposure
{
    public int RetailExposureId { get; set; }
    public int RetailModelId { get; set; }
}


public class PocRetailExposure : RetailExposure
{
    [NotMapped]
    public string IncidentScore { get; set; }
}

и мой код OnModelCreating:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RetailExposure>().ToTable("dbo.RetailExposure");
        modelBuilder.Entity<RetailExposure>().Map<PocRetailExposure>(p => p.Requires("RetailModelId").HasValue(1).IsRequired());
    }

Однако, когда я добавляю новую запись экспозиции:

        context.RetailExposures.Add(new RetailExposure { RetailModelId = 1 });
        context.SaveChanges();

, я получаю следующую ошибку:

System.Data.MappingException: 
(6,10) : error 3032: Problem in mapping fragments starting at line 6:Condition 
member 'RetailExposure.RetailModelId' with a condition other than 'IsNull=False'
is mapped. Either remove the condition on RetailExposure.RetailModelId or remove 
it from the mapping.

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

Есть идеи, как мне настроить контекст, чтобы это работало?Или я пытаюсь сделать что-то, что EF в настоящее время не поддерживает?

Я понимаю, что могу сказать EF просто полностью игнорировать производные классы, но это не совсем то, что я хочу.

1 Ответ

3 голосов
/ 04 августа 2011

Дискриминатор не должен отображаться как свойство в объекте - он не поддерживается.Дискриминатор - это просто столбец в базе данных, который сопоставлен с подтипом фактического объекта.Если вы хотите иметь дискриминатор в качестве свойства, вы не можете отобразить TPH.Также, если ваша родительская сущность не является абстрактной, она также должна иметь значение, определенное для дискриминатора.

Что-то вроде:

public class RetailExposure
{
    public int RetailExposureId { get; set; }
}

public class PocRetailExposure : RetailExposure
{
    [NotMapped]
    public string IncidentScore { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<RetailExposure>().ToTable("dbo.RetailExposure");
    modelBuilder.Entity<RetailExposure>()
                .Map<RetailExposure>(p => p.Requires("RetailModelId").HasValue(0))
                .Map<PocRetailExposure>(p => p.Requires("RetailModelId").HasValue(1));
}
...