刚开始使用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 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 模型。