我正在尝试使用ASP.NET API连接到外部数据库,但我一直收到此错误:
Microsoft.Data.SqlClient.SqlException:'无效的对象名称'Parkings'。 Microsoft.EntityFrameworkCore.Relational.dll中发生类型为“ Microsoft.Data.SqlClient.SqlException”的异常,但未在用户代码中处理 无效的对象名称“停车场”。
但是,我可以从我的nodejs服务器应用程序连接到数据库,并在其中为数据添加种子。
代码:
IP,用户名和密码出于明显原因未显示
appsettings.json
:
{
"ConnectionStrings": {
"ParkingContext": "Server=xxx.xxx.xxx.xxx,xxxxx;Database=Parkings;User Id=xxxxx;Password=xxxxxx;"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
Startup.cs:
public class Startup {
public Startup(IConfiguration configuration) {
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services) {
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
services.AddDbContext<ParkingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("ParkingContext")));
services.AddScoped<IParkingRepository, ParkingRepository>();
services.AddSwaggerDocument();
services.AddCors(options => options.AddPolicy("AllowAllOrigins", builder => builder.AllowAnyOrigin()));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
if (env.IsDevelopment()) {
app.UseDeveloperExceptionPage();
} else {
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseSwaggerUi3();
app.UseSwagger();
app.UseRouting();
app.UseEndpoints(endpoints => {
endpoints.MapControllers();
});
}
}
public class ParkingContext : DbContext {
public DbSet<Parking> Parkings { get; set; }
public DbSet<Entry> Entries { get; set; }
public ParkingContext(DbContextOptions<ParkingContext> options) : base(options) {
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
var connectionString = @"Server=xxx.xxx.xxx.xxx,xxxx;Database=Parkings;User Id=xxxx;Password=xxxx;";
optionsBuilder.UseSqlServer(connectionString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
}
}
答案 0 :(得分:1)
首先,我不认为您应该两次指定连接字符串。您在这里指定它:
services.AddDbContext<ParkingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("ParkingContext")));
在这里:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
var connectionString = @"Server=xxx.xxx.xxx.xxx,xxxx;Database=Parkings;User Id=xxxx;Password=xxxx;";
optionsBuilder.UseSqlServer(connectionString);
}
第一个就足够了。
EntityFrameWork是一个ORM,因此您需要确保DbSet与数据库中的现有表相对应,并且实体中的所有属性均与这些表中的现有列相对应。
如果您检查所有这些,但仍然失败。然后从MSDN code first to an existing database
阅读这篇文章答案 1 :(得分:0)
您可以尝试在连接字符串中使用InitialCatalog
属性,而不是Database
属性。否则,请确保此处正确使用了“停车场”对象。