运行所选代码生成器时出错:无法检索 xxx.Goal 的元数据 .. 由应用程序用户的外键引起

Posted

技术标签:

【中文标题】运行所选代码生成器时出错:无法检索 xxx.Goal 的元数据 .. 由应用程序用户的外键引起【英文标题】:there was an error running the selected code generator: Unable to retrieve MetaData for xxx.Goal.. being caused by a foreign key to application user 【发布时间】:2020-09-26 15:02:54 【问题描述】:

我对 asp.net MVC 5 和 entityframework 6 还是很陌生 当我尝试使用视图创建控制器时,我不断收到上述错误

这是我正在尝试为其创建视图的模型:

public class Goal
    
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int GoalId  get; set; 
        [StringLength(120, ErrorMessage = "Max length is 120 and Min length is 0", MinimumLength = 4)]
        public string Title  get; set; 
        public GoalStatus Status  get; set; 

        public string OwnerUserId  get; set;         
        public ApplicationUser OwnerUser  get; set; 

        public List<GoalPlan> Plans  get; set; 
    

这是我的 dbcontext 类代码

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        

        


        public virtual DbSet<Goal> Goals  get; set; 
        public virtual DbSet<GoalPlan> GoalPlans  get; set; 
        public virtual DbSet<GoalTask> GoalTasks  get; set; 
        public virtual DbSet<LinkableItem> LinkableItems  get; set;       


        public static ApplicationDbContext Create()
        
            return new ApplicationDbContext();
        
    

当我注释掉 OwnerUserId 行时,它会成功运行。

数据库已创建。

每次在创建控制器之前更改代码时,我都会重新构建项目。

如果我在 OwnerUserId 上使用 [ForeignKey("OwnerUser")] 属性,这也会失败。

谁能帮我解决为什么我收到元数据错误? 我喜欢继续学习 c# mvc。

编辑...

所以我将 OwnerUserId 更改为 int 并且允许脚手架工作。但是问题没有解决……

AspNetUsers 是通过代码优先初始代码迁移使用以下 SQL 创建的......

CREATE TABLE [dbo].[AspNetUsers] (
[Id]                   NVARCHAR (128) NOT NULL,
[Email]                NVARCHAR (256) NULL,
[EmailConfirmed]       BIT            NOT NULL,

目标/索引方法中的行是 var items = await db.Goals.Include(x => x.OwnerUser).ToListAsync();

在视图中是 html.DisplayFor(modelItem => item.OwnerUser.UserName)

最后是哪个问题,目标表的创建如下

CREATE TABLE [dbo].[Goals] (
[GoalId]       INT            IDENTITY (1, 1) NOT NULL,
[Title]        NVARCHAR (120) NULL,
[Status]       INT            NOT NULL,
[OwnerUserId]  INT            NOT NULL,
[OwnerUser_Id] NVARCHAR (128) NULL,
CONSTRAINT [PK_dbo.Goals] PRIMARY KEY CLUSTERED ([GoalId] ASC),
CONSTRAINT [FK_dbo.Goals_dbo.AspNetUsers_OwnerUser_Id] FOREIGN KEY 
([OwnerUser_Id]) REFERENCES [dbo].[AspNetUsers] ([Id])
);

值存储在 OwnerUserId 中;

再次感谢;

【问题讨论】:

首先将OwnerUserId属性的数据类型从字符串更改为int。 好的,谢谢...请参阅上面的编辑...我将把 Goal 对象属性更改为 OwnerUser_Id 并重新创建所有内容,看看是否可以解决问题。 【参考方案1】:

好的,这是我自己问题的答案

目标属性应该是

[ForeignKey("OwnerUser")]
public string OwnerUserId  get; set;         
public ApplicationUser OwnerUser  get; set; 

和我的原始代码一样,包括注释,但我不确定它是否需要....

然后 ApplicationDbContext 被更新为以下流利的

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        modelBuilder.Entity<Goal>()
            .HasRequired(x => x.OwnerUser)
            .WithMany(x => x.Goals)
            .HasForeignKey(x => x.OwnerUserId);

        modelBuilder.Entity<GoalTask>()
            .HasRequired(x => x.AssignedToUser)
            .WithMany(x => x.GoalTasks)
            .HasForeignKey(x => x.AssignedToUserId);
    

使用字符串正确创建数据库表。 控制器脚手架工作 index 方法正确显示用户名。

【讨论】:

以上是关于运行所选代码生成器时出错:无法检索 xxx.Goal 的元数据 .. 由应用程序用户的外键引起的主要内容,如果未能解决你的问题,请参考以下文章

运行所选代码生成器时出错:无法解析类型“Microsoft.EntityFrameworkCore.DbContextOption”的服务

VS 2015 - 运行所选代码生成器时出错 - 此问题的解决方案是什么?

VS 2013 脚手架中的“运行所选代码生成器时出错”

运行所选代码生成器时出错:“对象引用未设置为对象的实例。”错误?

另一个“运行所选代码生成器时出错:”和“包还原失败。回滚包更改“(解决方案名称)

运行所选代码生成器时出错:“值-1超出了可接受的[0,2147483647]范围。参数名称:value”