C# 使用enum作为FK的实体框架核心

C# 使用enum作为FK的实体框架核心,c#,asp.net-core,entity-framework-core,C#,Asp.net Core,Entity Framework Core,我想使用枚举在这两个类之间建立一个关系。但是,在使用迁移创建数据库之后,将创建两个外键。为什么要创造两次呢 InterventionStateId InterventionStateId1 这是代码 论语境类 modelBuilder.Entity<Intervention>() .Property(i => i.InterventionStateId) .HasConversion<int>();

我想使用枚举在这两个类之间建立一个关系。但是,在使用迁移创建数据库之后,将创建两个外键。为什么要创造两次呢

InterventionStateId
InterventionStateId1
这是代码

论语境类

        modelBuilder.Entity<Intervention>()
          .Property(i => i.InterventionStateId)
          .HasConversion<int>();

        modelBuilder.Entity<Intervention>()
           .HasOne(i => i.InterventionState)
           .WithMany()
           .HasForeignKey(i => i.InterventionStateId);
以及实体

public class Intervention
{
    public Intervention()
    {
        InterventionStateId = InterventionStates.PendingValidation;
    }

    public int Id { get; set; }
    public string Description { get; set; }
    public InterventionStates InterventionStateId { get; set; }
    public InterventionState InterventionState { get; set; }
}


public enum InterventionStates
{
    PendingValidation = 1,
    PendingStatus = 2,
    Closed = 3
}

[Table("hInterventionStates")]
public class InterventionState
{
    [Key]
    public InterventionStates Id { get; set; }
    public string Name { get; set; }

    public ICollection<Intervention> Interventions { get; set; }

}

根据这些评论,我会像这样对实体建模

public class Intervention
{
    public int Id { get; set; }
    public string Description { get; set; }
    public int InterventionStateId { get; set; }
    public virtual InterventionState InterventionState { get; set; }
}

public class InterventionState
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Intervention> Interventions { get; set; }

}

但实际上不需要比这更多的配置。

基于这些评论,我会像这样对实体建模

public class Intervention
{
    public int Id { get; set; }
    public string Description { get; set; }
    public int InterventionStateId { get; set; }
    public virtual InterventionState InterventionState { get; set; }
}

public class InterventionState
{
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Intervention> Interventions { get; set; }

}

但实际上不需要比这更多的配置。

InterferenceStates表中有任何点吗?当然是context.interferences.Wherei=>i.interferencestates.Equals//state;也可以这样做吗?关键是能够直接在SQL Server Select*中从Interferences中查询它,其中InterferenceStateId=//无论您想要什么,仍然不需要InterferenceStates表我需要加入才能获得实际Id的含义,我的一些团队将无法检查代码,他们不知道整数值的含义主键对每一行都应该是唯一的。你正在寻找的方法行不通。使用@BarryO'Kane的建议在InterferenceStates表中有任何意义吗?当然是context.interferences.Wherei=>i.interferencestates.Equals//state;也可以这样做吗?关键是能够直接在SQL Server Select*中从Interferences中查询它,其中InterferenceStateId=//无论您想要什么,仍然不需要InterferenceStates表我需要加入才能获得实际Id的含义,我的一些团队将无法检查代码,他们不知道整数值的含义主键对每一行都应该是唯一的。你正在寻找的方法行不通。使用@BarryO'Kane的建议主键仍然需要是InterventionStates类型,尽管它确实不是。使用枚举作为主键是个坏主意。要么将字段作为属性存储在干预表中并引用它,要么按照我建议的方法进行操作。正如我所说的,在这种情况下尝试使用枚举只是在自找麻烦,没有好处。如果我尝试将主键用作整数,它会给我一个例外,它说InterfertationStateID和InterfertationState上的Id不兼容。我不认为这样做有什么坏处,使用enum,我可以在编码时知道名称,而不是猜测每个Id号是什么,或者必须在数据库中查找。我还关闭了查找表的标识。你说得很对。我从问题中复制了代码,忘记将FK属性更改为int.Updated。您特别提到了我的团队中的一些人无法检查代码的用例,因此这可能是一个问题,也可能不是。您是否需要InterferenceState的名称?是的,我一直在这样做,名称与枚举中的属性相同,只是格式化为向用户显示名称。的确,我可以在代码中保留映射,但如果其他人需要查询或我无法访问代码,则在数据库中保留查找表会更容易。主键仍然需要是interferencestates类型,尽管它确实不需要。使用枚举作为主键是个坏主意。要么将字段作为属性存储在干预表中并引用它,要么按照我建议的方法进行操作。正如我所说的,在这种情况下尝试使用枚举只是在自找麻烦,没有好处。如果我尝试将主键用作整数,它会给我一个例外,它说InterfertationStateID和InterfertationState上的Id不兼容。我不认为这样做有什么坏处,使用enum,我可以在编码时知道名称,而不是猜测每个Id号是什么,或者必须在数据库中查找。我还关闭了查找表的标识。你说得很对。我从问题中复制了代码,忘记将FK属性更改为int.Updated。您特别提到了我的团队中的一些人无法检查代码的用例,因此这可能是一个问题,也可能不是。您是否需要InterferenceState的名称?是的,我一直在这样做,名称与枚举中的属性相同,只是格式化为向用户显示名称。的确,我可以在代码中保留映射,但如果其他人需要查询或我无法访问代码,则在数据库中保留查找表更容易。