[英]SqlException: Invalid object name
我正在使用 EF 核心开始一个新项目。 我在 MSSQL 服务器上有一个现有数据库,我运行此命令以包含其用于 EF 的结构。
Scaffold-DbContext "Server={My Server};Database={My DB};Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer
这为我创建了模型类,例如:
public partial class Cameras
{
public int CameraId { get; set; }
public string Description { get; set; }
}
和以下上下文类:
public partial class SetupToolContext : DbContext
{
public virtual DbSet<Cameras> Cameras { get; set; }
public SetupToolContext(DbContextOptions<SetupToolContext> options) : base(options)
{ }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Cameras>(entity =>
{
entity.HasKey(e => e.CameraId)
.HasName("PK_Cameras");
entity.Property(e => e.Description).HasColumnType("varchar(500)");
});
}
}
我的解决方案中有 4 层:
这是我的代码中流程的样子:
控制器类
public class ValuesController : Controller
{
ICameraRepository cameraRepository;
public ValuesController(ICameraRepository cameraRepository)
{
this.cameraRepository = cameraRepository;
}
[HttpGet]
public IEnumerable<Cameras> Get()
{
//ERROR: "Invalid object name 'Cameras'."
return cameraRepository.List();
}
}
CameraRepository 类
public class CamerasRepository : GenericRepository<Cameras>, ICameraRepository
{
private readonly SetupToolContext dbContext;
public CamerasRepository(SetupToolContext dbContext) : base(dbContext)
{
this.dbContext = dbContext;
}
}
public interface ICameraRepository : IRepository<Cameras>
{ }
GenericRepository 类(尝试遵循存储库模式)
public class GenericRepository<T> : IRepository<T> where T : class
{
private readonly SetupToolContext dbContext;
public GenericRepository(SetupToolContext dbContext)
{
this.dbContext = dbContext;
}
public IEnumerable<T> List()
{
return dbContext.Set<T>().AsEnumerable();
}
}
public interface IRepository<T>
{
IEnumerable<T> List();
}
和 Startup 类的 ConfigureServices 方法
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<SetupToolContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SQLServerConnection")));
services.AddMvc();
services.AddScoped<ICameraRepository, CamerasRepository>();
}
问题是我收到一个错误: "Invalid object name 'Cameras'."
说起来有点尴尬,但我仍然会发布这个答案,以防其他人因为没有注意到这个“次要”细节而出现同样的错误。 我有 2 个数据库,结果我忘记将连接字符串中的数据库名称更改为正确的数据库名称。 我在Scaffold-DbContext
命令中更改了它,只是忘记在连接字符串中也更改它...
{
"ConnectionStrings": {
"SQLServerConnection": "Server=localhost;Database={I had the wrong db name here};Trusted_Connection=True;"
}
}
所以改变它正确的解决了它。
我遇到了一个完全不同的问题,它带来了一个完全不同的解决方案。
当我在搭建脚手架时,我在开发过程中会在不同的数据库之间穿梭。
这是我用来从本地数据库搭建的命令
dotnet ef dbcontext scaffold --data-annotations "Data Source=(local)\SQLEXPRESS;Database=WebApp_DEV;Integrated Security=True" Microsoft.EntityFrameworkCore.SqlServer --context-dir Data --output-dir Models --force --no-onconfiguring
它将 Context 对象放入“Data”文件夹,将 Components 放入“Models”文件夹。
我摆脱了“OnConfiguring”,以便我可以在相应的部分中创建自己的。
我在我的 Program 类上创建了一个静态帮助函数,这样每次我想访问数据库时都不必直接引用上下文。
我的辅助方法使用了“WebApp_MainContext”类,我的部分工作正常......但是在 Dev 中添加的类从来没有工作......让我沮丧了好几个小时......
我尝试在我的脚本中复制它,但它需要手动重命名类..
回想起来,尝试一个简单的文件副本非常愚蠢......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.