【问题标题】:Unable to determine the relationship represented by navigation property to an Enum type entity无法确定导航属性表示的与枚举类型实体的关系
【发布时间】:2021-04-03 13:46:30
【问题描述】:

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

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);
    }
}

我在这里搜索了其他帖子,许多人建议在 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);

【问题讨论】:

  • 为什么Status.StatusIDHasNoKey 上有Key 属性调用Entity&lt;Status&gt;
  • Status 上的Key 不是作为注释生成的数据库,HasNoKey 部分用于在运行时将StatusID 从 DB 转换为 Enum 类型。这两个都是为了让无状态工作流工作。

标签: c# asp.net-core-3.1


【解决方案1】:

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

ALTER TABLE [Industrial].[Process]  WITH CHECK ADD  CONSTRAINT [FK_Process_Status_StatusID] FOREIGN KEY([StatusID])
REFERENCES [Industrial].[Status] ([StatusID])

我拥有的是[FK_Process_Status],而不是[FK_Process_Status_StatusID]

这是在 Microsoft SQL Server 中。

【讨论】:

    猜你喜欢
    • 2019-10-17
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2018-04-01
    • 1970-01-01
    相关资源
    最近更新 更多