הגדרת חיבור DB ב-EF
-
מנסה ליצור חיבור ל-DB באמצעות ספריית Context של EF.
נתחיל מהסוף הנה השגיאה (זמן ריצה)
database "Numbers" requested by the login. The login failed. Login failed for user 'LAPTOP-QLS0D39V\yaakov'.'
יש לי DB שיצרתי ב-MSSMS בשם UploadProject.
בתוכו יש טבלה בשם Numbers שמכילה שדה אחד בשם number מסוג int. (יש כעת 2 רשומות אקראיות).ה-Context נראה כך:
public class Context: DbContext { public Context(DbContextOptions<Context> options) : base(options) { } public virtual DbSet<MyNumberEO> Numbers { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyNumberEO>().HasKey(n => n.Number); } }
כאשר MyNumberEO נראה כך
[Table("Numbers")] public class MyNumberEO { public int Number { get; set; } }
ConnectionStrings נראית כך
{ "ConnectionStrings": { "UploadProject": "Data Source=(localdb)\\ProjectsV13;Initial Catalog=Numbers;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" },
למעשה יש לי עוד פרוייקט עם אותו ConnectionString למעט כמובן השם וה-Initial Catalog וזה עובד לי טוב.
קובץ ה-startup.cs נראה כך:public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { string ConnectionString = Configuration.GetConnectionString("UploadProject"); services.AddDbContext<Context>(options => options.UseSqlServer(ConnectionString)); services.AddControllers(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
שורה תחתונה יש את השגיאה שבראש ההודעה.
יש רעיון למישהו? -
@dovid צודק.
הנה הקוד. סתם קונטרולר לשם הבדיקה[Route("api/[controller]")] [ApiController] public class Numbers : ControllerBase { private readonly Context context; public Numbers(Context context) { this.context = context; } [HttpGet] [Route("GetNumberFromServer")] public IActionResult GetNumberFromServer() { List<int> ln = context.Numbers.Select(x => x.Number).ToList(); return Ok(ln[0]); } }
-
עוד קצת מידע
אני מנסה את הכתובת הבאהhttps://localhost:44345/api/Numbers/GetNumberFromServer
מתבצעת כניסה לקונטורולר
אבל השרת מקפיץ את השגיאה הנה מורחבתMicrosoft.Data.SqlClient.SqlException HResult=0x80131904 Message=Cannot open database "Numbers" requested by the login. The login failed. Login failed for user 'LAPTOP-QLS0D39V\yaakov'. Source=Core Microsoft SqlClient Data Provider StackTrace: at Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken, DbConnectionPool pool, SqlAuthenticationProviderManager sqlAuthProviderManager) at Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) at Microsoft.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) at Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection) at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection) at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions) at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry) at Microsoft.Data.SqlClient.SqlConnection.Open() at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at uploadProj2.Controllers.Numbers.GetNumberFromServer() in C:\Users\yaakov\source\repos\uploadProj2\uploadProj2\Controllers\Numbers.cs:line 24 at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync() at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync() This exception was originally thrown at this call stack: [External Code] uploadProj2.Controllers.Numbers.GetNumberFromServer() in Numbers.cs [External Code]
-
@yyy כתב בהגדרת חיבור DB ב-EF:
נ.ב. עד מתי אמשיך ליפול ולשרוף שעות על השטויות הקטנות והקריטיות האלו???
אני לגמרי כמוך, תראה איזה הלוך ושוב כתבתי לך כשהתשובה הייתה כבר בשלוש שורות הראשונות של השאלה שלך...
יש כאלה מפתחים שחזקים בלשים לב לפרטים, אני לא... -
@yyy כתב בהגדרת חיבור DB ב-EF:
תודה רבה זה עובד. אין כמוך.
נ.ב. עד מתי אמשיך ליפול ולשרוף שעות על השטויות הקטנות והקריטיות האלו???רק תפילה (ברצינות) יש לפעמים דברים קטנים שאתה מפספס ויכול לקחת שבוע למצוא אותם אם אין לך סייעתא דשמייא
-
-
@yossiz כתב בהגדרת חיבור DB ב-EF:
זה נמשך כל החיים למרות שזה מתמעט עם הזמן
מהנסיון שלי עם חבר (הרבה יותר ותיק ממני בתכנות), הרבה פעמים מה שעוזר לזה: זה לעבור על הקוד (שיתוף מסך וכדו') עם חבר טוב, בד"כ תוך זמן קצר עולים על הבעיה. לפעמים אפילו שיחה טלפונית עם רקע על הבעיה כשהחבר מנסה להעלות השערות גם עוזר בזמן קצר.
[ההסבר לזה לכאורה כי המח של המתכנת שכתב את הקוד נמצא בריבוע מסוים, כשמגיע משיהו במחוץ זה פותח את הריבוע].