β Use cautiously β lazy loading can cause performance issues (N+1 queries). π 7. Difference between Eager, Lazy, and Explicit Loading. Type Description Example Eager Loading Load related data with the main query _context.Products.Include(p => p.Category) Lazy Loading Load data automatically when accessed product.Category.Name (auto fetches) Explicit Loading Manually load data later _context.Entry(product).Reference(p => p.Category).Load() Follow : Best practice: Use Eager loading for known data needs β more predictable and efficient. π 8. What are Value Converters in EF Core?
Value converters transform data between your entity property and database column type.
Example:
Store an enum as a string in the DB:
modelBuilder.Entity<User>()
.Property(u => u.Status)
.HasConversion<string>();
Or encrypt/decrypt sensitive data:
.Property(p => p.SSN)
.HasConversion(
v => Encrypt(v), // to DB
v => Decrypt(v)); // from DB
π 9. What is the Change Tracker?
The Change Tracker keeps track of all entity states (Added, Modified, Deleted,
Unchanged) in a DbContext session.
Example:
var product = _context.Products.Find(1);
product.Price = 1500;
var entries = _context.ChangeTracker.Entries();
foreach (var entry in entries)
Console.WriteLine($"{entry.Entity.GetType().Name} -
{entry.State}");
Follow :
When you call _context.SaveChanges(), EF Core generates the required SQL
automatically.
π 10. How does EF Core handle concurrency?
EF Core uses optimistic concurrency β multiple users can edit the same data, but if one
user saves after another, a DbUpdateConcurrencyException occurs.
Example:
Add a concurrency token:
public class Product
public int Id { get; set; }
public string Name { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
EF Core will include RowVersion in the WHERE clause to detect conflicts.
π³ 11. How to use transactions in EF Core?
You can use:
using var transaction = _context.Database.BeginTransaction();
try
_context.Add(new Product { Name = "Book" });
_context.SaveChanges();
_context.Add(new Order { ProductId = 1 });
_context.SaveChanges();
Follow :
transaction.Commit();
catch
transaction.Rollback();
Or rely on EF Coreβs automatic transaction within a single SaveChanges().
β‘ 12. How do you execute raw SQL in EF Core?
For performance tuning or advanced queries:
var products = _context.Products
.FromSqlRaw("SELECT * FROM Products WHERE Price > 1000")
.ToList();
For non-query operations:
_context.Database.ExecuteSqlRaw("UPDATE Products SET Price = Price *
1.1");
You can also use interpolated strings safely:
.FromSqlInterpolated($"SELECT * FROM Products WHERE Name = {name}");
π΅ 13. What are Shadow Properties?
Shadow properties exist in the model but not in your C# class β EF Core creates them
automatically (like CreatedDate or UpdatedBy).
Example:
Follow :
modelBuilder.Entity<Product>()
.Property<DateTime>("CreatedOn")
.HasDefaultValueSql("GETDATE()");
You can access them via the Change Tracker:
var createdOn =
context.Entry(product).Property("CreatedOn").CurrentValue;
π§± 14. What is DbSet<T>?
A DbSet<T> represents a table in the database and provides an API for querying and
saving instances.
Example:
public class AppDbContext : DbContext
public DbSet<Product> Products { get; set; }
Usage:
var allProducts = _context.Products.ToList();
π± 15. How to seed data in EF Core?
You can seed data via the Fluent API in OnModelCreating.
Example:
modelBuilder.Entity<Category>().HasData(
new Category { Id = 1, Name = "Electronics" },
new Category { Id = 2, Name = "Books" }
Follow :
Then run:
dotnet ef migrations add SeedData
dotnet ef database update
π 16. Whatβs new in EF Core 7/8?
Highlights:
- Bulk updates/deletes:
_context.Products.Where(...).ExecuteUpdateAsync()
- JSON column mapping (EF 7+)
- Improved raw SQL mapping
- Better performance in LINQ translation
- TPH/TPM inheritance enhancements
- Auto compile query caching
- TimeOnly/DateOnly support (EF 8)
EF Core 8 is optimized for .NET 8 and cloud-native apps.
β 17. How do you optimize EF Core performance?
Best Practices: