月ごとにデータを別々のSQLテーブルにアーカイブするコンソールアプリケーションを作成しました。各テーブルには同一のスキーマがありますが、名前とタイムスタンプが異なります。カスタムテーブル名を使用したエンティティフレームワークモデルの繰り返し作成。可能なキャッシングの問題
Readings_201610、Readings_201609
私はReadingsクラスを毎回異なるテーブル名にポイントするDbContextを作成して削除することを何ヶ月も繰り返していきたいと思います。何らかの理由で私のアプローチは最初のデータベース作成では機能しますが、コンテキストが暗黙的に処理され再作成されていても、2番目の反復でテーブル名を変更するようには見えません。
以下は、DbContext自体のトリミングされたコード、テーブル名を引数として受け入れるテーブル構成、およびループ内でコンテキストを初期化するプログラムです。なぜこれが失敗しているのかについての洞察はすばらしいでしょう。
私は、これをアーカイブ技術に関する議論に回さないことをお勧めします。私はこれがEntity Frameworkのキャッシングのいくつかの面でバグだと思っています。
DbContext:
public class ReadingContext : DbContext
{
private readonly string tablePrefix;
public ReadingContext(string tablePrefix) : base("name=ArchiveDatabase")
{
this.tablePrefix = tablePrefix;
}
public DbSet<Reading> BackupReadings { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new BackupReadingsConfiguration(tablePrefix));
base.OnModelCreating(modelBuilder);
}
}
テーブル構成:
public class BackupReadingsConfiguration : EntityTypeConfiguration<Reading>
{
public BackupReadingsConfiguration(string tablePrefix)
{
// Map the table name
string tableName = "Readings";
if (!string.IsNullOrEmpty(tablePrefix))
{
tableName = string.Format("{0}_{1}", tableName, tablePrefix);
}
this.ToTable(tableName);
}
}
プログラム:
public static void Main(string[] args)
{
string _tablePrefix;
DateTime _startDateTime = Properties.Settings.Default.StartDate;
DateTime _endDateTime = Properties.Settings.Default.EndDate;
int _year = _startDateTime.Year;
int _month = _startDateTime.Month;
while (new DateTime(_year, _month, 1, 0, 0, 0) < _endDateTime.AddDays(1))
{
_tablePrefix = string.Concat(_year.ToString("D4"), _month.ToString("D2"));
using (var readingContext = new ReadingContext(_tablePrefix))
{
// Do Something
// First DbContext creation has correct table name, all subsequent DbContext creations the table name remains the same as the first.
}
_month = ++_month % 13;
if (_month % 13 == 0)
{
_year = ++_year;
_month = ++_month;
}
}
}
あなたは同じデータベースをターゲットにしています。つまり、最初のコンテキストでは既知のスキーマを持つデータベースが作成され、他の人はスキーマがすでに正しくあり、何も変更されていないことがわかります(この設定によってデータベースが再現される)。 1つのコンテキストにすべてを追加したり、異なるデータベースを使用したり、自分でスキーマを処理したりする必要があります。 – DevilSuichiro
コメントをいただきありがとうございます。同じデータベースに登録する必要があります。コードがばかげて厄介にならなければ、特にEntity Frameworkは単一のテーブルを単一のテーブル(そしてすべてのテーブルが同一)で使用できるため、すべてを1つのコンテキストに追加することには消極的です。だから私は自分自身でスキーマを扱わなければならないと思うので、これに関するアドバイスやリソースは本当に便利です。 – sebpinski