C# 无法确定导航属性表示的与枚举类型实体的关系

C# 无法确定导航属性表示的与枚举类型实体的关系,c#,asp.net-core-3.1,C#,Asp.net Core 3.1,我有一个.Net Core 3.1 web项目,它有一个实体(进程)引用枚举类型的实体(状态)。它是这样设置的,无状态工作流使用它来处理程序中进程状态的更改。在运行时,它在此行失败,并显示上述异常消息: processes = await _dbContext.Process.ToListAsync(); 'Unable to determine the relationship represented by navigation property 'Process.Status' of ty

我有一个.Net Core 3.1 web项目,它有一个实体(
进程
)引用枚举类型的实体(
状态
)。它是这样设置的,无状态工作流使用它来处理程序中进程状态的更改。在运行时,它在此行失败,并显示上述异常消息:

processes = await _dbContext.Process.ToListAsync();
'Unable to determine the relationship represented by navigation property 'Process.Status' of type 'Status'. 
Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.'
完整的异常消息:

processes = await _dbContext.Process.ToListAsync();
'Unable to determine the relationship represented by navigation property 'Process.Status' of type 'Status'. 
Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.'
以下是模型和dbcontext代码:

public enum StatusID : int
{
    [Display(Name = "Draft")]
    Draft = 1,

    [Display(Name ="In Review")]
    InReview = 2,

    [Display(Name = "Approved")]
    Inactive = 3
}

[Table("Status", Schema = "Industrial")]
public class Status
{
    private Status() { }

    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public StatusID StatusID { get; private set; }

    [StringLength(50)]
    public string Name { get; private set; }
}

[Table("Process", Schema = "Industrial")]
public partial class Process
{
    [Key]
    public int ProcessID { get; set; }
    public StatusID StatusID { get; set; } = StatusID.Draft;
    [ForeignKey("StatusID")]
    public virtual Status Status { get; private set; }
}

public class DbContext
{
    public DbSet<Process> Process { get; set; }
    public DbSet<Status> Status { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    
        modelBuilder.Entity<Status>().HasNoKey().Property(c => c.StatusID)
         .HasConversion(
             v => v.ToString().ToLowerInvariant(),
             v => (StatusID)Enum.Parse(typeof(StatusID), v, true)
         )
         .HasColumnName("GeneralName")
         .IsUnicode(false);
    }
}
公共枚举状态ID:int
{
[显示(Name=“草稿”)]
草案=1,
[显示(Name=“正在查看”)]
InReview=2,
[显示(Name=“已批准”)]
非活动=3
}
[表(“状态”,Schema=“工业”)]
公共阶级地位
{
私有状态(){}
[Key,DatabaseGenerated(DatabaseGeneratedOption.None)]
public StatusID StatusID{get;private set;}
[长度(50)]
公共字符串名称{get;private set;}
}
[表(“流程”,Schema=“工业”)]
公共部分类过程
{
[关键]
public int ProcessID{get;set;}
public StatusID StatusID{get;set;}=StatusID.Draft;
[外键(“状态ID”)]
公共虚拟状态状态{get;private set;}
}
公共类DbContext
{
公共数据库集进程{get;set;}
公共数据库集状态{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.Entity().HasNoKey().Property(c=>c.StatusID)
.哈斯转换(
v=>v.ToString().ToLowerInvariant(),
v=>(StatusID)Enum.Parse(typeof(StatusID),v,true)
)
.HasColumnName(“通用名称”)
.IsUnicode(假);
}
}
我在这里搜索了其他帖子,很多人建议在DbContext中的OnModelCreating方法中设置导航定义,我尝试了一些变体,都失败了。以下是我尝试过的几个:

modelBuilder.Entity<Process>()
                .HasOne("Status", "Status")
                .WithOne("Status");


modelBuilder.Entity<Process>()
                    .HasOne(p => p.Status)
                    .WithOne()
                    .HasForeignKey<Status>(m => m.StatusID)
                    .OnDelete(DeleteBehavior.Restrict);
modelBuilder.Entity()
.HasOne(“状态”、“状态”)
.有一个(“身份”);
modelBuilder.Entity()
.HasOne(p=>p.Status)
.WithOne()
.HasForeignKey(m=>m.StatusID)
.OnDelete(DeleteBehavior.Restrict);

我找到了这个问题的根本原因,这是因为我的数据库表生成脚本在外键创建语句中有一个错误,应该如下所示:

ALTER TABLE [Industrial].[Process]  WITH CHECK ADD  CONSTRAINT [FK_Process_Status_StatusID] FOREIGN KEY([StatusID])
REFERENCES [Industrial].[Status] ([StatusID])
我得到的是
[FK\U进程状态]
,而不是
[FK\U进程状态\U状态ID]


这是在Microsoft SQL Server中。

为什么在
状态上有
属性。StatusID
HasNoKey
调用
实体
?在
状态
上的
不是作为注释生成的数据库,
HasNoKey
部分用于在运行时将
StatusID
从DB转换为枚举类型。这两种方法都是为了让无状态工作流工作。