EF Core DbFirst 방식을 사용하고 있습니다. 내 dbContext Scaffold-DbContext 명령에 의해 자동으로 만들어집니다.
dbContext에 추가 DbSets를 추가하고 dbContext의 OnModelCreating 메서드에 추가 코드를 추가해야하지만 추가 된 코드가 지워지는 각 스캐 폴딩 이후에 매번 다시 추가해야합니다.
내가 뭘하고 싶은 부분적으로 다른 dbContext 클래스를 만들고 보호 된 무효 OnModelCreating (ModelBuilder modelBuilder) 부분 메서드로 표시하는 것입니다
하지만 오류가 발생합니다 :
다음은 의사 코드입니다.
MyDbContext1.cs - Scaffold-DbContext에 의해 생성됩니다.
public partial class MyDbContext : DbContext
{
public MyDbContext()
{
}
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
public virtual DbSet<Client> Clients { get; set; }
protected override partial void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Client>(entity =>
{
// ... some code
}
}
}
MyDbContext2.cs - 스캐 폴딩 후 매번 dbContext에 추가 한 코드입니다.
public partial class MyDbContext
{
public virtual DbSet<JustAnotherEntity> AnotherEntity { get; set; }
protected override partial void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<JustAnotherEntity>(entity =>
{
entity.HasKey(e => new {e.Id, e.IdAction, e.IdState})
.ForSqlServerIsClustered(false);
});
}
}
대안은 실제로 모든 사용자 정의 코드를 포함하는 MyDbContext를 상속하는 또 다른 컨텍스트 클래스를 만드는 것입니다. 이 새로운 클래스를 컨텍스트로 사용하십시오. 이렇게하면 생성 된 코드를 업데이트 할 필요가 없습니다.
public class MyDbContext2 : MyDbContext
{
public MyDbContext2()
{
}
public MyDbContext2(DbContextOptions<MyDbContext> options)
: base(options)
{
}
public virtual DbSet<JustAnotherEntity> AnotherEntity { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<JustAnotherEntity>(entity =>
{
entity.HasKey(e => new {e.Id, e.IdAction, e.IdState})
.ForSqlServerIsClustered(false);
});
}
}
이제 다음과 같은 부분 클래스에서 OnModelCreatingPartial
을 구현할 수 있습니다.
public partial class RRStoreContext : DbContext
{
partial void OnModelCreatingPartial(ModelBuilder builder)
{
builder.Entity<RepeatOrderSummaryView>().HasNoKey();
}
}
생성 된 컨텍스트 파일을 보면 바로 끝에 표시됩니다.
OnModelCreatingPartial(modelBuilder);
참고 : 저장 프로 시저에 HasNoKey
를 수동으로 추가해야했기 때문에 필요했습니다 (맞춤형 반환 유형으로 스캐 폴딩되지 않음).