所选代码生成器出现错误 运行:无法检索 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
我是 asp.net MVC 5 和 entityframework 6 的新手
当我尝试创建一个带有 views
的控制器时,我不断收到上述错误
这是我正在尝试为其创建视图的模型:
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 class 代码
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,
goal/index方法中的行是
var items = await db.Goals.Include(x => x.OwnerUser).ToListAsync();
在视图中是
Html.DisplayFor(modelItem => item.OwnerUser.UserName)
最后是哪个问题,目标table创建如下
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 中;
再次感谢;
好的,这是我自己问题的答案
目标属性应该是
[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);
}
数据库 table 使用字符串正确创建。
控制器脚手架工程
索引方法正确显示用户名。
我是 asp.net MVC 5 和 entityframework 6 的新手 当我尝试创建一个带有 views
的控制器时,我不断收到上述错误这是我正在尝试为其创建视图的模型:
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 class 代码
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,
goal/index方法中的行是 var items = await db.Goals.Include(x => x.OwnerUser).ToListAsync();
在视图中是 Html.DisplayFor(modelItem => item.OwnerUser.UserName)
最后是哪个问题,目标table创建如下
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 中;
再次感谢;
好的,这是我自己问题的答案
目标属性应该是
[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);
}
数据库 table 使用字符串正确创建。 控制器脚手架工程 索引方法正确显示用户名。