在我当前的项目中,我首先将代码与EF Core中的映射类一起使用。我的一个实体Action
是一个抽象类,它具有多个继承者ActionOne
,ActionTwo
和ActionThree
。我正在使用带有枚举标识符ActionType
的TPH,该标识符的值从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
标识列并将其设置为主键,从而足够快地解决了该问题。
我想在这里提出一个问题,看看是否有任何主题专家可以解决我的难题。