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