Первичный ключ дискриминатора сохранился со значением по умолчанию в EF Core - PullRequest
0 голосов
/ 30 августа 2018

Фон

Сначала я использую код с классами отображения в EF Core в моем текущем проекте. Одна из моих сущностей, Action - это абстрактный класс, имеющий несколько наследников ActionOne, ActionTwo и ActionThree. Я использую TPH с дискриминатором enum ActionType, значения которого начинаются с 1 и выше (это важно для дальнейшего использования).

Сущность:

public abstract class Action
{
     public DateTime OccurredOn { get; set; }

     public virtual User User { get; set; }
}

public class ActionOne : Action
{
     public int Count { get; set; }
}

public class ActionTwo : Action
{
     public string Text { get; set; }
}

public class ActionThree : Action
{
     public double Value { get; set; }
}

public enum ActionType
{
     One = 1,
     Two = 2,
     Three = 3
}    

Отображения:

public void Configure(EntityTypeBuilder<Action> builder)
{
    builder.ToTable("Actions", "dbo")
        .HasDiscriminator<ActionType>("ActionType")
        .HasValue<ActionOne>(ActionType.One)
        .HasValue<ActionTwo>(ActionType.Two)
        .HasValue<ActionThree>(ActionType.Three);

    // Indexes 

    // Properties
    builder.Property<ActionType>("ActionType")
        .HasColumnName("ActionType");
    builder.Property(t => t.OccurredOn)
           .HasColumnName("OccurredOn")
           .IsRequired();
    builder.Property<int>("UserID")
        .HasColumnName("UserID");

    // Relationships
    builder.HasOne(t => t.User)
           .WithMany()
           .HasForeignKey("UserID")
           .IsRequired();

    // Primary Key
    builder.HasKey("ActionType", "UserID", "OccurredOn");

}

Выпуск

При создании новой сущности Action, добавлении ее в контекст и сохранении - сохраненная запись имеет ActionType, равную 0 (значение по умолчанию для перечисления), что вызывает конфликт в первичный ключ и эти объекты никогда не могут быть восстановлены.

Пример использования:

var action1 = new ActionOne
{
    User = user,
    OccurredOn = DateTime.UtcNow,
    Count = count
};

dbContext.Set<Action>().Add(action1);

dbContext.SaveChanges();

Пока что попыток ...

Я пытался удалить свойства тени, а также изменить порядок операторов отображения. Меня не интересует разоблачение ActionType как свойства, и я тоже не пробовал.

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

В качестве обходного пути я добавил идентификационный столбец ID и установил его в качестве первичного ключа, что решило проблему достаточно быстро.

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

...