dotNET Scaffold 不会生成代码,因为实体具有一对多关系

问题描述 投票:0回答:1

刚开始使用ASP.net,从JAVA迁移过来。尝试为项目自动生成控制器。虽然我在官方网站上的教程中设法做到了这一点,但发现了一个问题,使其无法在我的“测试”项目上运行。当我将一些集合放入实体中时遇到问题,没有这个集合它工作正常。

问题是如何让它发挥作用?我认为问题出在两个数据库之间的某个连接处(这是一个(用户)对多(链接)。

这是用户模型:

public class UserItem
{
    [Key]
    public long UserId { get; set; }

    [Required]
    [MinLength(3, ErrorMessage = "Min 3 char")]
    [MaxLength(20)]
    public string? Name { get; set; }

    [Required]
    [MinLength(6, ErrorMessage = "Min 6 char"), MaxLength(20)]
    public required string Password { get; set; } // todo: private set;

    // [ForeignKey("Links")]
    // [ConcurrencyCheck]
    public ICollection<LinkItem> Links { get; set; }

    public UserItem()
    {
        Links = new List<LinkItem>();
    }
}

这是链接模型:

public class LinkItem
{
    [Key]
    public long UserId { get; set; }
    [ForeignKey("UserId")]
    public UserItem? UserItem { get; set; }
    public string? Link { get; set; }
}

这是 DbContext:

public class UserLinksDb : DbContext
{
    public UserLinksDb(DbContextOptions<UserLinksDb> options) : base(options) { }

    public DbSet<UserItem> UserItems { get; set; } = null!;
    public DbSet<LinkItem> LinkItems { get; set; } = null!;

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<LinkItem>().HasKey(k => k.UserId);
        modelBuilder.Entity<LinkItem>( e => 
        {
            e.HasKey(k => k.UserId);
            e.HasOne(k => k.UserItem)
            .WithMany(k => k.Links)
            .HasForeignKey(k => k.UserId)
            .OnDelete(DeleteBehavior.ClientSetNull);
        });
    }
}

这就是我连接到内存数据库的方式:

builder.Services.AddDbContext<UserLinksDb>(option => option.UseInMemoryDatabase("LinksList"));

这就是我尝试生成控制器的方式:

dotnet aspnet-codegenerator controller -name LinksController -async -api -m UserItem -dc UserLinksDb -outDir Controllers

当我尝试在终端中执行代码生成器命令时,出现此错误:

Could not get the reflection type for DbContext : UserLinksDb

asp.net .net asp.net-core-webapi scaffolding asp.net-mvc-scaffolding
1个回答
0
投票

我 看起来您正在尝试使用实体框架在 ASP.NET Core 应用程序中对 UserItem 和 LinkItem 之间的一对多关系进行建模。但是,您的代码中有几个问题需要解决。

LinkItem 中的键配置不正确:

您的LinkItem类中,按键配置不正确。每个 LinkItem 的键应该是唯一的,并且应该是一个单独的属性(不是 UserId 属性,它是外键)。

public class LinkItem
{
    [Key]
    public long LinkItemId { get; set; } // Change this to a unique key for LinkItem

    [ForeignKey("UserId")]
    public long UserId { get; set; }

    public UserItem? UserItem { get; set; }
    public string? Link { get; set; }
} 

UserItem 中的ForeignKey 属性:

在您的 UserItem 类中,您不需要 [ForeignKey("Links")] 属性。该关系是在 DbContext 中的 OnModelCreating 方法中配置的。 夏普

public class UserItem
{
    [Key]
    public long UserId { get; set; }

    [Required]
    [MinLength(3, ErrorMessage = "Min 3 char")]
    [MaxLength(20)]
    public string? Name { get; set; }

    [Required]
    [MinLength(6, ErrorMessage = "Min 6 char"), MaxLength(20)]
    public string Password { get; set; }

    // Remove [ForeignKey("Links")]
    // [ConcurrencyCheck]
    public ICollection<LinkItem> Links { get; set; }

    public UserItem()
    {
        Links = new List<LinkItem>();
    }
}

通过这些更改,您的模型应该正确表示 UserItem 和 LinkItem 之间的一对多关系。确保您的迁移在进行这些更改后得到更新:

dotnet ef migrations add <MigrationName>
dotnet ef database update

这将根据更新的模型将更改应用到您的数据库架构。现在,您应该能够毫无问题地将支架控制器用于您的 UserItem 和 LinkItem 模型。

© www.soinside.com 2019 - 2024. All rights reserved.