엔티티 프레임워크 및 다중 스키마
단일 Oracle 데이터베이스에서 여러 스키마를 처리할 수 있도록 dbContext를 설정하려고 합니다.단일 dbContext 파일을 원하지 않았기 때문에 다음과 같은 방법을 생각해 냈습니다.
public class oraDbContext : DbContext
{
static oraDbContext() {
Database.SetInitializer<oraDbContext>(null);
}
public oraDbContext(string connName)
: base("Name=" + connName) { }
public _schema1 schema1 = _schema1.Instance;
public _schema2 schema2 = _schema2.Instance;
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
schema1.OnModelCreating(modelBuilder);
schema2.OnModelCreating(modelBuilder);
}
}
스키마 파일은 다음과 같습니다.
public sealed class _schema1
{
private static readonly _schema1 instance = new _schema1();
static _schema1() { }
private _schema1() { }
public static _schema1 Instance {
get {
return instance;
}
}
public DbSet<someTable> someTable { get; set; }
internal void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Configurations.Add(new someTableMap());
}
}
그러나 쿼리를 수행하려고 하면 다음 오류가 발생합니다.Value cannot be null
그것이 언급하는 가치는someTable
_property1의 속성입니다.
A. 어떻게 고칠 수 있습니까?
B. 더 좋은 해결책이 있습니까?
편집: 여기서 제가 원하는 것은 다음과 같은 코드를 작성할 수 있는 기능입니다.
var query1 = from p in db.schema1.someTable
select p;
var query2 = from p in db.schema2.someTable
select p;
여기서 someTable은 두 스키마에서 동일합니다.데이터베이스에는 열이 동일하거나 거의 동일한 테이블을 가진 스키마가 여러 개 있습니다.스키마 5개에서 풀하는 쿼리를 만드는 경우 잠재적으로 5개의 다른 연결을 의미할 수 있기 때문에 각 스키마에 대해 별도의 dbContext를 만들고 싶지 않습니다.동일한 쿼리를 직선 SQL로 작성할 경우 하나의 연결로 5개의 스키마에서 데이터를 가져올 수 있습니다. 이것이 바로 제가 여기서 수행하고자 하는 목표입니다.
Entity Framework에 대한 조사를 하던 중 다음과 같은 게시물을 발견했습니다.
http://romiller.com/2011/05/23/ef-4-1-multi-tenant-with-code-first/
작업할 수 있는 단일 dbContext를 제공하지는 않지만 단일 연결만 사용합니다(여러 dbContext를 사용하지 않으려는 이유).다음 코드를 설정한 후:
public class oraDbContext : DbContext
{
static oraDbContext() {
Database.SetInitializer<oraDbContext>(null);
}
private oraDbContext(DbConnection connection, DbCompiledModel model)
: base(connection, model, contextOwnsConnection: false) { }
public DbSet<SomeTable1> SomeTable1 { get; set; }
public DbSet<SomeTable2> SomeTable2 { get; set; }
private static ConcurrentDictionary<Tuple<string, string>, DbCompiledModel> modelCache = new ConcurrentDictionary<Tuple<string, string>, DbCompiledModel>();
public static oraDbContext Create(string schemaName, DbConnection connection) {
var compiledModel = modelCache.GetOrAdd(
Tuple.Create(connection.ConnectionString, schemaName),
t =>
{
var builder = new DbModelBuilder();
builder.Configurations.Add<SomeTable1>(new SomeTable1Map(schemaName));
builder.Configurations.Add<SomeTable2>(new SomeTable2Map(schemaName));
var model = builder.Build(connection);
return model.Compile();
});
return new oraDbContext(connection, compiledModel);
}
}
이를 위해서는 당연히 내 매핑 파일을 다음과 같이 설정해야 합니다.
public class DailyDependencyTableMap : EntityTypeConfiguration<DailyDependencyTable>
{
public SomeTableMap(string schemaName) {
this.ToTable("SOME_TABLE_1", schemaName.ToUpper());
//Map other properties and stuff
}
}
여러 스키마를 사용하는 쿼리를 작성하는 것은 다소 귀찮지만 현재로서는 필요한 작업을 수행합니다.
using (var connection = new OracleConnection("a connection string")) {
using (var schema1 = oraDbContext.Create("SCHEMA1", connection))
using (var schema2 = oraDbContext.Create("SCHEMA2", connection)) {
var query = ((from a in schema1.SomeTable1 select new { a.Field1 }).ToList())
.Concat((from b in schema2.SomeTable1 select new { b.Field1 }).ToList())
}
}
다음을 통해 테이블별로 스키마를 지정할 수 있습니다.Table
기여하다.
[Table(nameof(MyTable1), Schema = "Schema1")]
public class MyTable1 { }
[Table(nameof(MyTable2), Schema = "Schema2")]
public class MyTable2 { }
대신 부분 클래스를 사용해 보십시오.
public partial class oraDbContext : DbContext
{
static oraDbContext() {
Database.SetInitializer<oraDbContext>(null);
}
public oraDbContext(string connName)
: base("Name=" + connName) { }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
schema1(modelBuilder);
schema2(modelBuilder);
}
}
public partial class oraDbContext : DbContext
{
public DbSet<someTable> someTable { get; set; }
void schema1(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new someTableMap());
}
}
언급URL : https://stackoverflow.com/questions/14902245/entity-framework-and-multiple-schemas
'programing' 카테고리의 다른 글
쿼리로 인해 CPU 활용률이 높아지고 지연 시간이 길어짐 (0) | 2023.07.12 |
---|---|
T-SQL 하위 문자열 - 마지막 3자 (0) | 2023.07.12 |
중지: 알 수 없는 인스턴스 mongodb(Ubuntu) (0) | 2023.07.12 |
Visual Studio 2013의 애플리케이션에서 Application Insight 제거 (0) | 2023.07.12 |
jquery 입력 모두 포커스 선택 (0) | 2023.07.12 |