私は ORM の経験があまりありません。マップされたクラスからのプロパティの追加/削除を、理想的には自動で汎用的な方法で処理する最良の方法を見つけようとしています。
ServiceStack.OrmLite と SQLite を使用しています。
データベースの目的はドキュメント ストアです。外部キー/参照整合性の問題はありません。
例えば
public class Foo
{
public Bar {get; set;}
public Baz {get; set;}
}
列 Bar、Baz を持つテーブル Foo を作成します。
理想的な世界では、Foo クラスは決して変更されないため、これについて心配する必要はありませんが、実際には変更される可能性があります。
Foo にも Quz プロパティが必要だとしましょう。
public class Foo
{
public Bar {get; set;}
public Baz {get; set;}
public Quz {get; set;}
}
読み取りは問題なく、Quz は null として返されるだけですが、Quz 列がないため挿入に失敗します。意味あり。
Baz が不要になったとしましょう。
public class Foo
{
public Bar {get; set;}
public Quz {get; set;}
}
読み取り/挿入は正常に機能しますが、基になるテーブルにはまだ少し面倒な Baz 列があります。
これはサーバー アプリであり、頻繁に再起動されることはないため、いくつかの点を考慮して却下しました。
開始時に、Foo テーブルが存在する場合は、それを一時ストアに読み込み、Foo を削除して再作成し (テーブルが正しいスキーマで作成されることを意味します)、データを再挿入します。これは正常に機能しているように見え、スキーマとクラスの同期を維持しますが、遅すぎます。
最初に、基礎となるテーブルにクエリを実行してその列定義を取得し、リフレクションを使用して Foo クラスの列が実際にどうあるべきかを判断します。必要に応じて列を追加/削除します。このアプローチを機能させることができると確信していますが、理想よりも複雑であり、それが良い考えであるとは確信していません.