主键识别符在EF Core中保留为默认值

时间:2018-08-30 01:42:32

标签: c# ef-code-first entity-framework-core table-per-hierarchy

背景

在我当前的项目中,我首先将代码与EF Core中的映射类一起使用。我的一个实体Action是一个抽象类,它具有多个继承者ActionOneActionTwoActionThree。我正在使用带有枚举标识符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标识列并将其设置为主键,从而足够快地解决了该问题。

我想在这里提出一个问题,看看是否有任何主题专家可以解决我的难题。

0 个答案:

没有答案