当我想从数据库中的 Managers 表检索数据时,出现错误:“System.Exception:‘on 子句’中的‘未知列’m.User_id’” 我正在使用 MySql 数据库开发 .Net Maui。数据库已经存在。 EF core 用于处理应用程序中的数据库交互。
Microsoft.EntityFrameworkCore.Database.Command: Error: Failed executing DbCommand (22ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
SELECT `u`.`User_id`, `u`.`CreatedAt`, `u`.`First_name`, `u`.`Last_name`, `m`.`Manager_id`
FROM `Users` AS `u`
INNER JOIN `Managers` AS `m` ON `u`.`User_id` = `m`.`User_id`
'WaiterEval.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.4\System.Diagnostics.StackTrace.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'WaiterEval.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.4\System.Reflection.Metadata.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'WaiterEval.exe' (CoreCLR: clrhost): Loaded 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.4\System.IO.Compression.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
Microsoft.EntityFrameworkCore.Query: Error: An exception occurred while iterating over the results of a query for context type 'WaiterEval.Services.MyDbContext'.
MySqlConnector.MySqlException (0x80004005): Unknown column 'm.User_id' in 'on clause'
[Table("Managers")]
public class Manager : User
{
public Manager(string First_name, string Last_name, DateTime CreatedAt) : base(First_name, Last_name) { }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[ForeignKey("User")]
public int Manager_id
{
get => User_id;
set => User_id = value;
}
public User User { get; set; }
}
[Table("Users")]
public class User
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // Auto-incremented primary key
public int User_id { get; set; }
[Required]
[Column(TypeName = "char(100)")]
public string First_name { get; set; }
[Required]
[Column(TypeName = "char(100)")]
public string Last_name { get; set; }
[Required]
[Column(TypeName = "date")]
public DateTime CreatedAt { get; set; } = DateTime.Now.Date; // Automatically generated date
}
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
{
}
// DbSet properties for your database entities
public DbSet<User> Users { get; set; }
public DbSet<Manager> Managers { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Manager>()
.HasOne(m => m.User)
.WithMany()
.HasForeignKey(m => m.Manager_id);
}
}
我的数据库是使用查询创建的:
CREATE TABLE Users (
User_id INT NOT NULL AUTO_INCREMENT,
First_name CHAR(100) NOT NULL,
Last_name CHAR(100) NOT NULL,
CreatedAt DATE NOT NULL DEFAULT (CURRENT_DATE),
PRIMARY KEY (User_id)
);
CREATE TABLE Managers (
Manager_id INT NOT NULL,
PRIMARY KEY (Manager_id),
FOREIGN KEY (Manager_id) REFERENCES Users(User_id)
);
我不明白为什么 ef 在 Managers 中的 user_id 中查找列。
我尝试过TPT、TPH。有和没有导航属性,不同的 OnModelCreating() 方法。结果没有改变。
您的管理器类正在扩展 User,因此您会混淆 EF。如果 Manager 是与 User 相关的单独实体/表,则不要继承 User:
public class Manager
{
[Key]
public int Manager_id { get; set; }
[ForeignKey("User_id")]
public virtual User User { get; set; }
}
如果管理员应该扩展用户,则删除用户导航属性和关系。 Manager 表应该有一个 User_id,因为它的 PK 和 EF 设置为 Table-per-Concrete 继承配置集,以具有单独的 User 和 Manager 表。