Ciallo~(∠・ω< )⌒☆
一切的起因是我在测试api来操作数据库的时候出现这个报错,本人小白第一次用这个东西,然后也是百思不得其解,我全部流程跟网上的代码基本一致,但是就是在运行的时候会出现这个问题。
省流版:
那是因为你那个set<T> 的变量名xxx与你那个数据库的那个表名xxx不一样导致的,只要你把DBContext里面的DBSet<T> 的那个变量名改的和你的表名一样就好了,结束~~~~~~~
前因(盘古开天说起)
pg数据库:
很普通对吧
DB代码
public class User
{
public string name { get; set; }
public string id { get; set; }
}
public class DBUser:DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseNpgsql("Username=postgres;Password=xiedashen666;Host=localhost;Database=Test");
}
//protected override void OnModelCreating(ModelBuilder modelBuilder)
//{
// modelBuilder.Entity<User>();
//}
}
这段是DBContext代码和User代码,User是数据库Test的Model,DBcontext顺便连接了一下数据库
Main代码
public static void Main(string[] args)
{
using (var mb=new DBUser())
{
mb.Database.EnsureCreated();
var blog = mb.Users.ToList();
Console.WriteLine( blog.Count);
foreach (var mbb in blog)
{
Console.WriteLine(4);
Console.WriteLine($"{mbb.id}+'____'+{mbb.name}");
}
}
Console.Read();
}
然后,运行就出现了
这里它说Users不存在,然后让我反思是不是数据库连接字符串出了问题,于是考虑是是不是应该public.Test,然后又手贱随便改连接字符串为"Username=postgres;Password=xiedashen666;Host=localhost;Database=public.Test"
还在DBContext里面加了下面这点代码:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>();
}
发现运行成功了,它没报错,但是它没进入前面Main里面的foreach循环,我直接输出那个list的数量,结果Count=0,为什么呢?
分析
如果连接字符串成立,那么应该为1,然后再打开pgsql看看怎么个事,结果是我那个创建数据库的代码生效了,名字叫public.Test,非常巧合的是,里面有一个表名叫Users,和我之前那个DBSet<User>那个对象的名字一样! 这就说明一个问题,efcore它还要求对象的名字和表名一模一样,同理,里面对象也是一样(一开始我没注意这个问题),然后我把我原先代码改回来然后改了一下变量名为User(我数据库里面的那个表名就是User),运行成功
这个问题好烦人,萌新落泪(哭)