求助:使用泛型仓库与Entity Framework 5.0时数据无法保存至数据库
Hey, let's figure out why your ASP.NET app with generic repository and Entity Framework isn't saving data to the database. Based on the code snippets you shared, here are the most common issues to check and fix:
Save() method implementation Your IGenericRepository interface defines a Save() method, but the critical part is how this method is implemented in your GenericRepository<C, T> class. If it's not properly calling EF's SaveChanges(), your data will never persist to the database. Here's what a correct implementation should look like:
public void Save() { try { // Make sure _context is your injected DbContext instance (type C) _context.SaveChanges(); } catch (DbUpdateException ex) { // Add logging or custom error handling here to diagnose issues // Example: _logger.LogError(ex, "Failed to save changes to database"); throw; } }
Double-check that your GenericRepository holds a valid, active instance of your custom DbContext—if the context is disposed early, SaveChanges() will fail silently or throw an error.
In ASP.NET, using the wrong lifecycle for your DbContext can break data persistence. A scoped lifecycle (one DbContext per HTTP request) is the recommended approach. If you're using a singleton or transient context, you might run into issues like disconnected entities or early disposal. Here's how to configure it correctly in Program.cs/Startup.cs:
// For .NET 6+ Program.cs builder.Services.AddDbContext<YourCustomDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("YourDatabaseConnection")));
EF relies on tracking entity states (Added/Modified/Deleted) to generate the right SQL commands. For example, when updating an entity that was created outside the current DbContext (like a DTO converted to an entity), you need to explicitly set its state in the Edit method:
public void Edit(T entity) { _context.Entry(entity).State = EntityState.Modified; }
For Add and Delete methods, EF usually tracks the state automatically if you're working with entities retrieved from the same context, but double-check that you're not passing detached entities without updating their state.
SaveChanges() Often, SaveChanges() fails silently because exceptions aren't being caught or logged. Common issues like unique constraint violations, missing required fields, or invalid data types will throw exceptions that can tell you exactly what's wrong. Add logging to your Save() method to expose these errors:
public void Save() { try { int affectedRows = _context.SaveChanges(); // Log to confirm rows were actually modified // _logger.LogInformation($"Successfully saved {affectedRows} rows"); } catch (DbUpdateException ex) { // Get detailed error info—inner exceptions often hold the real issue string errorMessage = $"Save failed: {ex.Message}. Inner error: {ex.InnerException?.Message}"; Console.WriteLine(errorMessage); // Replace with your logging system throw; } }
If you're wrapping multiple repository operations in a transaction, make sure the transaction is being committed properly. A rolled-back transaction will prevent all changes from being saved to the database.
If you're testing by querying immediately after calling Save(), make sure the query runs after Save() completes. If you run the query before saving, you'll get old data from EF's cache, which can make it look like the save failed even if it didn't.
内容的提问来源于stack exchange,提问作者saif

