C 언어
Entity Framework 인터뷰를 준비한다는 것은 실제 역량을 밝혀내는 질문을 예상한다는 것을 의미합니다. Entity Framework 인터뷰 질문은 사고, 성과 인식, 그리고 후보자가 개념을 실제로 적용하는 방법을 보여줍니다.
Mastering Entity Framework는 데이터 기반 플랫폼에서 클라우드 서비스에 이르기까지 현대 개발 전반에 걸쳐 역할을 열어줍니다. 실용적인 노출은 분석 능력을 구축하고 기술 깊이를 강화하며 팀을 지원합니다. 채용 리더는 실무적인 문제 해결, 확장 가능한 설계, 후배 멘토링, 신입생을 위한 성장 경로를 중요하게 생각합니다.
더 읽어보세요…👉 무료 PDF 다운로드:Entity Framework 인터뷰 질문 및 답변
EF(Entity Framework)는 개발자가 원시 SQL 대신 강력한 형식의 .NET 개체로 데이터 작업을 수행할 수 있도록 하여 데이터베이스 상호 작용을 단순화하는 .NET용 Microsoft ORM(객체 관계형 매핑) 프레임워크입니다. . 이 추상화를 통해 개발자는 익숙한 C# 구문을 사용하여 CRUD(만들기, 읽기, 업데이트, 삭제) 작업을 수행할 수 있으며, 프레임워크는 이러한 작업을 내부적으로 최적화된 SQL 쿼리로 변환하는 작업을 처리합니다. EF는 상용구 데이터 액세스 코드를 줄이고, 유지 관리성을 향상시키며, 컴파일 시간 유형 안전성을 강화하는 데 도움이 됩니다.
예를 들어, SQL을 작성하는 대신 다음을 사용할 수 있습니다.
var customers = context.Customers.Where(c => c.IsActive).ToList();
EF는 이 LINQ 쿼리를 SQL로 변환하고, 데이터베이스에 대해 실행하고, 결과를 개체로 반환합니다.
Entity Framework는 세 가지 주요 개발 접근 방식을 지원합니다:
각 접근 방식은 다양한 시나리오를 지원합니다. 코드 우선 민첩한 개발, 데이터베이스 우선에서 인기가 있습니다. 레거시 데이터베이스와 Model First에서 선호됩니다. 시각적 모델링이 중요한 경우에 적합합니다.
DbContext 데이터베이스와의 세션을 관리하는 기본 클래스입니다. , 엔터티 변경 사항을 추적하고 데이터를 데이터베이스에 다시 저장하도록 조정합니다. 이는 C# 애플리케이션과 데이터베이스 간의 브리지를 나타냅니다. DbContext을 통해 , DbSet<TEntity>을 정의합니다. 엔터티 컬렉션을 나타내고 데이터베이스의 테이블에 매핑되는 속성입니다.
예:
public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
여기 Products CRUD 작업을 수행하기 위한 컬렉션 역할을 합니다. EF는 이 컨텍스트를 사용하여 객체 상태를 추적합니다. SaveChanges()에서 SQL 명령을 생성합니다. .
이전 스키마 변경사항을 추적하고 적용하는 메커니즘입니다. 시간이 지남에 따라 데이터베이스에. 모델이 발전함에 따라 마이그레이션을 통해 SQL 스크립트를 수동으로 수정하지 않고도 데이터베이스를 동기화 상태로 유지할 수 있습니다. Code First에서는 다음과 같은 명령을 사용합니다.
Add-Migration InitialCreate Update-Database
이는 스키마 변경 사항을 정의하고 이를 데이터베이스에 적용하는 마이그레이션 클래스를 생성합니다. 마이그레이션을 통해 데이터베이스 스키마의 버전을 제어하고 공동 개발을 촉진할 수 있습니다.
EF에서는 관련 데이터를 효율적으로 로드하는 것이 중요합니다. 비교는 다음과 같습니다:
.Include()를 통해 관련 데이터가 미리 로드됨 관련 데이터가 필요하다는 것을 알고 있는 경우에 사용하세요.명시적 로드 쿼리 후 수동으로 로드관련 데이터가 로드되는 시기를 정확하게 제어할 수 있습니다. 예:
var orders = context.Orders.Include(o => o.Customer).ToList(); // Eager
지연 로드는 초기 쿼리를 줄이는 데 도움이 되지만 N+1 쿼리 문제를 일으킬 수 있습니다. 주의 깊게 사용하지 않으면.
변경 내용 추적은 엔티티 상태 변경을 모니터링하기 위한 EF의 내부 메커니즘입니다. 쿼리가 실행된 후. DbContext로 엔터티를 검색하는 경우 , 추적됩니다. 해당 속성에 대한 모든 수정 사항이 기록되며 SaveChanges() 호출되면 EF는 적절한 SQL INSERT을 생성합니다. , UPDATE 또는 DELETE 진술. 추적이 불필요한 읽기 전용 시나리오의 경우 AsNoTracking() 변경 사항 추적을 비활성화하여 성능을 향상시킵니다.
동시성 제어는 동일한 데이터를 업데이트하는 여러 사용자가 실수로 서로의 변경 사항을 덮어쓰지 않도록 보장합니다. EF는 낙관적 동시성을 사용합니다. 기본적으로. 일반적인 접근 방식은 동시성 토큰을 추가하는 것입니다. (예:RowVersion 타임스탬프). EF는 SaveChanges() 동안 이 토큰을 확인합니다. , 데이터베이스 버전과 다른 경우 DbUpdateConcurrencyException 이 발생하여 충돌을 나타냅니다. 그런 다음 개발자는 이 예외를 처리하여 데이터 차이를 재시도하거나 해결할 수 있습니다.
탐색 속성은 엔터티 간의 관계를 정의합니다. 이를 통해 EF는 연결을 탐색할 수 있습니다. (예:일대다) 수동 조인 없이:
public class Order
{
public int Id { get; set; }
public Customer Customer { get; set; }
}
여기 Customer Order를 연결하는 탐색 속성입니다. 관련 Customer . EF는 이러한 속성을 사용하여 쿼리 중에 자동으로 관계와 조인을 구축합니다. 탐색 속성은 외래 키와 함께 작동합니다. 관계의 모범이 됩니다.
AsNoTracking() 쿼리에 대한 변경 내용 추적을 비활성화합니다. 이는 읽기 전용에 유용합니다. 검색된 엔터티를 업데이트하지 않으려는 작업. 이는 메모리 사용량을 줄이고 오버헤드를 추적하여 성능을 향상시킵니다. 대용량 데이터 세트를 수정하지 않고 가져올 때 특히 유용합니다.
컴파일된 쿼리는 성능 최적화 기술입니다. LINQ 쿼리가 실행될 때 EF는 일반적으로 매번 쿼리를 SQL로 변환합니다. 컴파일된 쿼리를 사용하면 이 변환이 한 번 수행되고 결과 대리자가 재사용되므로 자주 실행되거나 복잡한 쿼리에 대한 오버헤드가 줄어듭니다. 트래픽이 많은 환경에서 사용하세요. 동일한 쿼리가 다른 매개변수를 사용하여 반복적으로 실행되는 시나리오.
Entity Framework는 각 엔터티의 상태를 추적합니다. SaveChanges() 중에 수행할 데이터베이스 작업을 결정하려면 . 주요 엔터티 상태는 다음과 같습니다:
INSERT 수정됨 기존 엔터티가 업데이트되었습니다UPDATE 삭제됨 제거 대상으로 표시된 항목DELETE 변경되지 않음 감지된 변경사항 없음없음분리됨 contextNone에 의해 추적되지 않음
SaveChanges()에 전화하면 , EF는 엔터티 상태를 검사하고 해당 SQL 명령을 실행합니다. 예를 들어, DbSet에 추가된 새 엔터티 추가됨으로 표시됩니다. , 결과적으로 INSERT이 발생합니다. 쿼리.
예:
context.Entry(product).State = EntityState.Modified; context.SaveChanges();
그러면 해당 엔터티에 대한 데이터베이스 기록이 명시적으로 업데이트됩니다.
상태 이해 데이터 동기화 및 성능을 더욱 효율적으로 제어할 수 있습니다.
Entity Framework는 강력한 이점을 제공하지만 사용 사례에 따라 몇 가지 절충안도 제공합니다.
최대 성능이 필요한 대규모 시스템의 경우 개발자는 여전히 원시 SQL과 EF를 혼합할 수 있습니다. 최적화를 위해.
Entity Framework는 탐색 속성을 통해 관계를 관리합니다. 및 외래 키 연결 .
관계 유형은 다음과 같습니다:
User ← UserProfile 일대다 하나의 엔터티가 여러 다른 엔터티와 관련되어 있습니다.Customer → Orders 다대다 여러 항목이 서로 관련되어 있습니다.Student ← Course 일대다의 예 관계:
public class Customer
{
public int CustomerId { get; set; }
public ICollection<Order> Orders { get; set; }
}
EF는 자동으로 외래 키를 생성하고 계속 삭제 규칙을 처리합니다. 구성에 따라 다릅니다.
Fluent API를 사용할 수도 있습니다. 보다 명확한 관계 매핑을 위해.
엔터티에 대한 LINQ Entity Framework의 일부이며 더 다양한 기능을 제공하는 반면 LINQ to SQL SQL Server 및 더 간단한 사용 사례로 제한됩니다.
따라서 엔터프라이즈 수준 개발에는 LINQ to Entities를 권장합니다.
DbContext 내부적으로 ObjectContext을 래핑합니다. 보다 깔끔하고 직관적인 API를 제공합니다. 대부분의 최신 .NET 애플리케이션은 DbContext을 사용해야 합니다. .
항목의 수명 주기는 상태 전환을 설명합니다. 생성부터 지속까지:
DbSet.Add()를 통해 컨텍스트에 추가됨 (상태:추가됨 ).SaveChanges() 호출 → SQL 명령이 실행되었습니다.이 수명 주기를 이해하면 데이터 문제를 디버깅하고 EF 컨텍스트 관리를 최적화하는 데 도움이 됩니다.
Fluent API OnModelCreating()에서 자주 사용되는 모델 관계, 제약 조건 및 매핑을 프로그래밍 방식으로 구성하는 방법을 제공합니다. DbContext의 메소드 .
데이터 주석이 포함된 구성을 세밀하게 제어할 수 있습니다. 표현할 수 없습니다.
예:
modelBuilder.Entity<Customer>() .HasMany(c => c.Orders) .WithOne(o => o.Customer) .HasForeignKey(o => o.CustomerId);
Fluent API는 복합 키 구성에 특히 강력합니다. , 다대다 관계 및 계단식 규칙 .
데이터 주석은 속성입니다. 스키마 동작을 정의하기 위해 모델 클래스 또는 속성에 직접 적용됩니다. Fluent API보다 간단하지만 유연성이 떨어집니다.
예:
public class Product
{
[Key]
public int ProductId { get; set; }
[Required]
[StringLength(50)]
public string Name { get; set; }
}
주석은 키, 문자열 길이, 필수 필드 및 관계를 정의합니다. 고급 사례의 경우 개발자는 일반적으로 데이터 주석을 결합합니다. 및 Fluent API .
DbContext에서 모니터링함 변경사항.업데이트의 기본 동작.추적되지 않는 엔터티 모니터링되지 않습니다. .AsNoTracking()으로 검색됨 .읽기 전용 작업에 적합합니다. 추적된 엔터티는 더 많은 메모리를 소비하지만 EF가 변경 사항을 자동으로 감지할 수 있도록 합니다.
추적되지 않은 항목은 성능을 향상시킵니다. 읽기는 많고 업데이트는 적은 시나리오에서.
Entity Framework를 사용하면 사용자 지정 쿼리나 성능이 중요한 쿼리에 대한 원시 SQL을 실행할 수 있습니다.
var result = context.Products
.FromSqlRaw("SELECT * FROM Products WHERE Price > 100")
.ToList();
쿼리 명령이 아닌 경우:
context.Database.ExecuteSqlRaw("DELETE FROM Products WHERE Discontinued = 1"); SQL 삽입을 방지하려면 이 기능을 주의해서 사용하세요. 데이터베이스에 구애받지 않는 유연성을 유지하세요.
EF(Entity Framework)와 EF Core(Entity Framework Core)는 아키텍처, 기능 및 크로스 플랫폼 지원이 다릅니다.
EF Core는 현대적이고 적극적으로 개발된 버전이며 유연성과 성능으로 인해 새로운 .NET 프로젝트에 권장되는 선택입니다.
Entity Framework의 트랜잭션은 데이터 무결성을 보장합니다. 여러 작업이 함께 성공하거나 실패해야 하는 경우 기본적으로 EF는 SaveChanges()를 래핑합니다. 거래 내부. 수동 제어:
using (var transaction = context.Database.BeginTransaction())
{
try
{
context.Customers.Add(new Customer());
context.SaveChanges();
context.Orders.Add(new Order());
context.SaveChanges();
transaction.Commit();
}
catch
{
transaction.Rollback();
}
}
이는 원자성을 보장합니다. 명령이 실패하면 모든 변경 사항이 롤백됩니다.
EF는 System.Transactions와도 통합됩니다. 분산 트랜잭션 지원을 위해.
Entity Framework는 클래스 계층 모델링을 위한 세 가지 주요 상속 매핑 전략을 지원합니다.
대부분의 개발자는 TPH를 선호합니다. 정규화 또는 성능 요구 사항이 달리 지정되지 않는 한 단순성을 위해.
Entity Framework 성능을 최적화하려면:
AsNoTracking() 사용 읽기 전용 쿼리의 경우..Include()가 포함된 필수 관련 엔터티만 .Select() 사용 .AddRange() 사용 및 SaveChanges() .context.Configuration.AutoDetectChangesEnabled = false; 잘 조정된 EF 구현은 개발자 생산성을 유지하면서 ADO.NET 성능에 근접할 수 있습니다.
그림자 속성 EF 모델에는 존재하지만 엔터티 클래스에는 없습니다. 이는 변경 추적기에서 EF에 의해 유지 관리되고 데이터베이스에 저장됩니다.
예:
modelBuilder.Entity<Order>()
.Property<DateTime>("LastUpdated");
이를 통해 EF는 엔터티 클래스를 수정하지 않고도 추가 메타데이터(예:타임스탬프, 감사 정보)를 저장할 수 있습니다.
다음을 통해 그림자 속성에 액세스할 수 있습니다:
var value = context.Entry(order).Property("LastUpdated").CurrentValue; 섀도우 속성은 로깅 또는 감사 시나리오에 이상적입니다.
EF Core의 값 변환기를 사용하면 데이터베이스에서 읽거나 데이터베이스에 쓸 때 속성 값을 변환할 수 있습니다.
예를 들어, 열거형을 문자열로 저장하려면:
modelBuilder.Entity<Employee>() .Property(e => e.Status) .HasConversion( v => v.ToString(), v => (EmployeeStatus)Enum.Parse(typeof(EmployeeStatus), v));
이는 enum와 같은 사용자 정의 데이터 유형에 대한 유연성을 향상시킵니다. , bool 또는 DateTimeOffset .
값 변환기는 암호화, 압축 또는 마스킹에도 사용됩니다. 민감한 데이터.
전역 쿼리 필터를 사용하면 항목에 대한 모든 쿼리에 자동으로 조건을 적용할 수 있습니다.
이는 일시 삭제에 특히 유용합니다. 또는 다중 테넌시 .
예:
modelBuilder.Entity<Employee>() .HasQueryFilter(e => !e.IsDeleted);
Employee에 대해 실행되는 모든 쿼리 명시적으로 재정의되지 않는 한 일시 삭제된 레코드를 자동으로 제외합니다.
글로벌 필터는 유지 관리성과 데이터 보안을 향상시킵니다.
실제 데이터베이스를 사용하지 않고 EF 로직을 단위 테스트하려면 인메모리 데이터베이스를 사용하세요. 또는 조롱 :
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseInMemoryDatabase("TestDb")
.Options;
DbSet 모의 Moq 같은 라이브러리 사용 격리된 테스트용입니다.단위 테스트에서는 다음을 확인해야 합니다.
SaveChanges() 이후의 데이터 일관성 EF Core InMemory를 사용한 테스트는 속도를 보장하고 SQL Server에 대한 종속성을 방지합니다.
이 두 가지 아키텍처 패턴은 추상적인 데이터 액세스에 도움이 됩니다. 트랜잭션 일관성 유지 .
IRepository<T> Add()와 인터페이스 , GetAll() 등작업 단위 트랜잭션 내에서 여러 저장소를 조정합니다.SaveChanges() 커밋 경계 역할을 합니다. 예:
public class UnitOfWork : IUnitOfWork
{
private readonly AppDbContext _context;
public void Commit() => _context.SaveChanges();
}
이러한 패턴은 테스트 가능성을 향상시킵니다. , 코드 재사용 및 관점의 분리 대기업 애플리케이션에 사용됩니다.
.Include() .Select() 예context.Orders.Include(o => o.Customer) context.Orders.Select(o => new { o.Id, o.Customer.Name }) 성능전체 개체 가져오기최소 데이터 가져오기사용 사례처리를 위해 관련 엔터티가 필요한 경우특정 경량 데이터가 필요한 경우 프로젝션 로딩은 성능 최적화입니다. 필요한 열만 선택하여 메모리 오버헤드를 줄여줍니다.
EF Core의 인터셉터를 사용하면 개발자가 쿼리 실행, 명령 생성 및 연결 열기와 같은 데이터베이스 작업을 가로채고 수정할 수 있습니다. .
이는 EF와 데이터베이스 공급자 간의 미들웨어 구성 요소 역할을 합니다.
예: 실행된 모든 SQL 명령을 기록합니다.
public class CommandInterceptor : DbCommandInterceptor
{
public override void ReaderExecuting(
DbCommand command,
CommandEventData eventData,
InterceptionResult<DbDataReader> result)
{
Console.WriteLine($"Executing SQL: {command.CommandText}");
base.ReaderExecuting(command, eventData, result);
}
}
DbContextOptionsBuilder에 등록하세요. :
optionsBuilder.AddInterceptors(new CommandInterceptor());
이점:
Entity Framework Core는 비동기 프로그래밍을 완벽하게 지원합니다. SaveChangesAsync()와 같은 방법을 통해 , ToListAsync() 및 FirstOrDefaultAsync() .
비동기식 실행은 확장성 향상에 도움이 됩니다. I/O 바인딩된 데이터베이스 작업을 기다리는 동안 스레드를 해제하여 웹 애플리케이션에서
예:
var customers = await context.Customers .Where(c => c.IsActive) .ToListAsync();
비동기 작업은 처리량이 많은 ASP.NET Core API에서 특히 효과적입니다. 및 마이크로서비스를 통해 호출 차단을 줄이고 응답 시간을 향상시킵니다.
연결 복원력은 애플리케이션이 일시적인 데이터베이스 오류로부터 자동으로 복구되는 데 도움이 됩니다. , 네트워크 중단이나 SQL 시간 초과 등이 있습니다.
다음과 같이 구성할 수 있습니다:
optionsBuilder.UseSqlServer( connectionString, options => options.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null) );
여기서 EF는 실패한 작업을 지연을 포함하여 최대 5회 재시도합니다.
이는 클라우드 호스팅 환경에서 특히 유용합니다. 일시적인 오류가 흔한 Azure SQL과 같습니다.
소유된 엔터티는 값 개체 모델링을 허용합니다. 다른 법인의 수명주기에 전적으로 의존합니다.
소유자와 동일한 테이블을 공유하며 독립적으로 존재할 수 없습니다.
예:
public class Address
{
public string Street { get; set; }
public string City { get; set; }
}
public class Customer
{
public int Id { get; set; }
public Address Address { get; set; }
}
구성:
modelBuilder.Entity<Customer>().OwnsOne(c => c.Address);
사용 사례:
주소와 같은 모델링 개념 , 돈 또는 측정 자신의 정체성이 없습니다.
일시 삭제는 레코드를 물리적으로 제거하는 대신 삭제된 것으로 표시합니다.
부울 플래그를 사용하여 구현됩니다. 및 전역 쿼리 필터 .
modelBuilder.Entity<Employee>() .HasQueryFilter(e => !e.IsDeleted);
삭제 작업에서:
employee.IsDeleted = true; context.Update(employee); context.SaveChanges();
장점:
단점:
EF Core 6+에서는 컴파일된 모델 EF 모델 메타데이터를 .NET 어셈블리로 사전 컴파일하여 시작 시간과 런타임 오버헤드를 줄일 수 있습니다.
단계:
dotnet ef dbcontext optimize 이점: 특히 엔터티가 많은 대규모 애플리케이션에서 초기화 지연 시간을 30~40% 줄입니다.
사용 사례: 고성능 마이크로서비스 및 서버리스 환경.
캐싱은 반복적인 데이터베이스 쿼리를 줄이는 데 도움이 됩니다. 두 가지 주요 레벨이 있습니다:
DbContext에 따라 내장됨 인스턴스자동으로 관리되는2단계 캐시 컨텍스트 간에 공유되는 외부 캐시EFCoreSecondLevelCacheInterceptor와 같은 라이브러리 사용 2단계 캐싱의 예:
services.AddEFSecondLevelCache(options =>
{
options.UseMemoryCacheProvider().DisableLogging(false);
});
이는 읽기가 많은 애플리케이션의 성능을 크게 향상시킵니다. 중복된 데이터베이스 적중을 방지합니다.
동시성 토큰은 업데이트 충돌을 방지합니다. 다중 사용자 환경에서.
[ConcurrencyCheck]를 사용하여 속성을 동시성 토큰으로 표시할 수 있습니다. 또는 [Timestamp] 속성입니다.
예:
public class Product
{
public int Id { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
}
업데이트가 발생하면 EF는 WHERE에 이 열을 포함합니다. 절.
값이 일치하지 않으면 DbUpdateConcurrencyException 발생합니다 — 낙관적 동시성 제어 보장 .
감사는 생성, 수정 또는 삭제한 사람과 같은 메타데이터를 추적합니다. 기록합니다.
SaveChanges()을 재정의할 수 있습니다. :
public override int SaveChanges()
{
var entries = ChangeTracker.Entries()
.Where(e => e.Entity is IAuditable &&
(e.State == EntityState.Added || e.State == EntityState.Modified));
foreach (var entry in entries)
{
var auditable = (IAuditable)entry.Entity;
auditable.LastModified = DateTime.UtcNow;
}
return base.SaveChanges();
}
인터페이스:
public interface IAuditable
{
DateTime Created { get; set; }
DateTime LastModified { get; set; }
}
이 방법은 감사 로직을 중앙 집중화하여 일관적인 데이터 거버넌스를 보장합니다. .
AsNoTracking()을 사용하세요 및 읽기 전용 쿼리에 대한 예측. 오버헤드를 줄입니다.디자인 저장소 및 작업 단위 패턴을 구현합니다. 유지 관리가 향상됩니다.보안 SQL 삽입을 방지하려면 매개변수화된 쿼리를 사용하세요. 데이터 보호.확장성 연결 풀링 및 비동기 방법을 사용합니다. 높은 부하를 처리합니다.이전 버전 제어와 함께 자동 마이그레이션을 사용합니다. 스키마 관리를 단순화합니다.구성 연결 문자열과 비밀을 외부화합니다. 환경 격리를 개선합니다.테스트 중 단위 테스트를 위해 InMemory 공급자를 사용하세요. 테스트 실행 속도가 빨라집니다.로깅 성능 통찰력을 얻으려면 EF 로깅을 활성화하세요. 디버깅이 쉬워집니다. 이러한 관행을 통해 강건성, 확장성, 유지 관리 가능성이 보장됩니다. Entity Framework를 기반으로 구축된 애플리케이션입니다.
Entity Framework는 LINQ 쿼리를 SQL로 자동 변환하지만 비효율적인 패턴으로 인해 느리거나 중복되는 SQL이 생성될 수 있습니다. LINQ를 최적화하면 ORM이 고성능 데이터베이스 쿼리를 생성할 수 있습니다.
예측 사용:
var customers = context.Customers
.Select(c => new { c.Id, c.Name })
.ToList();
클라이언트 측 평가 방지: AsNoTracking()를 사용하세요. 읽기 전용 데이터용입니다.var orders = context.Orders.AsNoTracking().ToList();컴파일된 쿼리 활용 반복되는 LINQ 작업의 경우불필요한
.Include()를 피하세요. 통화 — 필요한 경우에만 관련 데이터를 포함합니다. 예:
비효율적:
context.Customers.ToList().Where(c => c.IsActive);
효율성:
context.Customers.Where(c => c.IsActive).ToList();
데이터 시드는 데이터베이스에 기본 또는 참조 데이터가 있는지 확인합니다. 생성되었을 때.
접근 방법 1:ModelBuilder 사용
modelBuilder.Entity<Role>().HasData(
new Role { Id = 1, Name = "Admin" },
new Role { Id = 2, Name = "User" }
);
Update-Database 동안 데이터가 자동으로 삽입됩니다. .
접근법 2:맞춤 시드 방법
시작 시 수동으로 코드 실행:
context.Database.Migrate();
if (!context.Users.Any())
{
context.Users.Add(new User { Name = "Admin" });
context.SaveChanges();
}
접근법 3:SQL 스크립트
마이그레이션 시 원시 SQL 사용:
migrationBuilder.Sql("INSERT INTO Roles (Name) VALUES ('Admin')");
권장사항:
HasData() 사용 정적 참조 데이터 및 동적 시작 데이터를 위한 프로그래밍 방식 시드용.
EF Core는 공급자에 구애받지 않습니다 , 즉 별도의 데이터베이스 공급자 패키지를 통해 여러 데이터베이스 엔진을 대상으로 지정할 수 있음을 의미합니다. .
일반 제공자:
Microsoft.EntityFrameworkCore.SqlServer MSSQLSQLiteMicrosoft.EntityFrameworkCore.Sqlite 모바일/데스크탑PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL PostgreSQLMySQLPomelo.EntityFrameworkCore.MySql MySQLCosmos DBMicrosoft.EntityFrameworkCore.Cosmos NoSQL 내부적으로 EF Core는 추상화 레이어를 사용합니다. 대상:
각 공급자는 EF Core의 기본 추상화(예:RelationalDatabaseProvider)에서 상속되는 자체 클래스를 구현합니다. , QuerySqlGenerator ).
분할 쿼리는 EF가 대규모의 복잡한 조인을 수행하는 것을 방지합니다. 하나가 아닌 여러 개의 SQL 쿼리를 실행하면 됩니다.
예:
var customers = context.Customers .Include(c => c.Orders) .AsSplitQuery() .ToList();
다음이 실행됩니다:
이점:
단점:
데이터베이스에 대한 여러 왕복.
분할 쿼리 사용 메모리 문제를 일으킬 수 있는 대용량 관련 데이터를 즉시 로드할 때.
SQL 모니터링은 느린 쿼리를 디버깅하고 ORM 동작을 최적화하는 데 도움이 됩니다.
optionsBuilder .UseSqlServer(conn) .LogTo(Console.WriteLine, LogLevel.Information);ILoggerFactory 통합
var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()); optionsBuilder.UseLoggerFactory(loggerFactory);인터셉터
DbCommandInterceptor 구현 명령과 타이밍을 캡처합니다.프로파일링 도구 다음과 같은 도구를 사용하세요:로깅은 선택적으로 활성화되어야 합니다. 성능 오버헤드를 피하기 위해 프로덕션 단계에 있습니다.
DetectChanges() AutoDetectChangesEnabled 예:
context.ChangeTracker.AutoDetectChangesEnabled = false;
foreach (var item in list)
{
context.Add(item);
}
context.SaveChanges();
루프에서 자동 감지를 비활성화하면 성능이 최대 40% 향상됩니다. 대량 작업 중입니다.
SQL Server 2016에 도입된 임시 테이블을 사용하면 기록 데이터를 추적할 수 있습니다. 자동으로.
단계:
builder.Entity<Employee>()
.ToTable("Employees", b => b.IsTemporal());
과거 데이터 쿼리:var history = context.Employees .TemporalAsOf(DateTime.UtcNow.AddDays(-7)) .ToList();
장점:
EF Core 6+는 전체 임시 쿼리를 지원합니다.
컴파일된 쿼리와 컴파일된 모델은 두 가지 성능 특징입니다. 서로를 보완하는 것입니다.
컴파일된 쿼리의 예:
static readonly Func<AppDbContext, int, Customer> _getCustomerById = EF.CompileQuery((AppDbContext ctx, int id) => ctx.Customers.FirstOrDefault(c => c.Id == id));
용도:
var customer = _getCustomerById(context, 5);
함께: 컴파일된 모델을 사용하면 시작 비용이 절감됩니다. , 컴파일된 쿼리는 런타임 쿼리 오버헤드를 줄여줍니다. — 빈도가 높은 쿼리에 적합 .
Entity Framework integrates seamlessly with ASP.NET Core’s built-in Dependency Injection (DI) system.
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Default")));
Then inject it into controllers or services:
public class CustomerService
{
private readonly AppDbContext _context;
public CustomerService(AppDbContext context)
{
_context = context;
}
}
Lifetimes:
Using DI ensures testability, lifecycle management , and resource efficiency across web and background processes.
Expected from candidate: The interviewer wants to assess your foundational understanding of Entity Framework and its value in real-world applications.
Example answer: Entity Framework is an Object-Relational Mapping framework for .NET that allows developers to work with databases using .NET objects instead of raw SQL. It is used in enterprise applications to improve productivity, reduce boilerplate data access code, and maintain a strong separation of concerns.
Expected from candidate: The interviewer wants to evaluate your knowledge of different development workflows and when to use each one.
Example answer: Code First starts with domain classes and generates the database from code. Database First begins with an existing database and generates entity classes. Model First uses a visual designer to define the model and then creates both code and database. Each approach is chosen based on project requirements and existing infrastructure.
Expected from candidate: The interviewer is checking your understanding of data modeling and relational mapping.
Example answer: Entity Framework handles relationships using navigation properties and foreign keys. It supports one-to-one, one-to-many, and many-to-many relationships, allowing developers to traverse related data using object references rather than joins.
Expected from candidate: The interviewer wants to hear a practical example demonstrating optimization skills.
Example answer: In my previous role, I improved performance by reducing unnecessary eager loading and implementing projection queries with Select statements. This minimized the amount of data retrieved from the database and significantly reduced query execution time.
Expected from candidate: The interviewer is assessing your experience with schema changes and version control.
Example answer: Migrations are managed using the built-in migration tools that track model changes over time. At a previous position, I regularly generated and reviewed migration scripts before applying them to ensure database integrity across environments.
Expected from candidate: The interviewer wants to test your understanding of data loading strategies and performance trade-offs.
Example answer: Lazy loading automatically loads related data when it is accessed. I would avoid using it in performance-critical scenarios or APIs because it can cause multiple unintended database calls, leading to the N+1 query problem.
Expected from candidate: The interviewer is evaluating your knowledge of data consistency and error handling.
Example answer: Entity Framework supports transactions through the DbContext and TransactionScope. At my previous job, I used explicit transactions to ensure that multiple related database operations either completed successfully together or were rolled back in case of failure.
Expected from candidate: The interviewer wants to see how well you understand modern application architecture.
Example answer: Dependency injection is used to inject the DbContext into services or controllers. This improves testability and maintainability by allowing the context to be mocked or replaced without changing business logic.
Expected from candidate: The interviewer is looking for problem-solving ability and debugging skills.
Example answer: In my last role, I encountered an issue with tracking conflicts when updating detached entities. I resolved it by explicitly setting entity states and ensuring that only one instance of each entity was tracked by the context.
Expected from candidate: The interviewer wants to understand your judgment and ability to choose appropriate technologies.
Example answer: I consider alternatives when applications require extremely high-performance data access or complex stored procedure logic. In such cases, using a micro-ORM or raw ADO.NET can provide more control and efficiency.
C 언어
톱질은 오늘날 사용되는 가장 오래된 절단 기술 중 하나이며 혁신을 통해 공정이 재료, 공차 및 제품 복잡성의 발전을 따라갈 수 있게 되었습니다. 정의에 따르면, 톱질은 톱니 또는 연마 절삭 공구를 표면에 대고 움직여 공작물의 좁은 슬릿을 절단하는 것입니다. 톱질은 공차에 대한 특별한 고려 없이 재료의 큰 부분을 제거하는 데 자주 사용되지만 최신 CNC 톱질 기계는 마무리 작업에도 사용할 수 있습니다. 톱질 용어 톱질 및 톱질 장비에 대해 자세히 알아보기 전에 몇 가지 핵심 용어를 숙지하는 것이 중요합니다. 갈퀴: 절단면과 비교
부품 및 재료 계산기(또는 계산을 위한 연필과 종이) 6볼트 배터리 1KΩ ~ 100kΩ 값의 다양한 저항기 상호 참조 전기 회로의 교훈 , 1권, 6장:분배 회로와 키르히호프의 법칙 학습 목표 전압계 사용 방법을 설명하기 위해 전류계 사용 방법 설명 저항계 사용법을 설명하기 위해 옴의 법칙을 사용하는 방법을 설명하기 위해 Kirchhoff의 현행법칙(KCL)을 사용하는 방법을 설명하기 위해 전류 분배기 디자인을 사용하는 방법을 설명하기 위해 개략도 그림 일반적