EntitySpaces (「ES」) ORM の経験がない、または現在使用していない場合、この質問はあなた向けではありません。
私は 10 年前のアプリケーションを持っていますが、4 年後には注意が必要です。私のアプリケーションは EntitySpaces と呼ばれる現在は機能していない ORM を使用しています。現時点では、別の ORM に切り替えることはできないため、これを機能させる方法を見つける必要があります。
私が最後にアプリケーションに積極的に取り組んだ時から現在 (ES バージョン 2012-09-30) までの間に、EntitySpaces (「ES」) は、基盤となる ADO.net バックエンドに大きな変更を加えました。私が助けを求めているシナリオは、エンティティ コレクションが列のサブセットのみで読み込まれる場合です。
_products = new ProductCollection();
_products.Query.SelectAllExcept(_products.Query.ImageData);
_products.LoadAll();
次に、最初の選択で読み込まれなかったプロパティをオーバーライドして、アクセサーで遅延読み込みできるようにします。以下は、完全に機能していた遅延読み込みプロパティの例です。
public override byte[] ImageData
{
get
{
bool rowIsDirty = base.es.RowState != DataRowState.Unchanged;
// Check if we have loaded the blob data
if(base.Row.Table != null && base.Row.Table.Columns.Contains(ProductMetadata.ColumnNames.ImageData) == false)
{
// add the column before we can save data to the entity
this.Row.Table.Columns.Add(ProductMetadata.ColumnNames.ImageData, typeof(byte[]));
}
if(base.Row[ProductMetadata.ColumnNames.ImageData] is System.DBNull)
{
// Need to load the data
Product product = new Product();
product.Query.Select(product.Query.ImageData).Where(product.Query.ProductID == base.ProductID);
if(product.Query.Load())
{
if (product.Row[ProductMetadata.ColumnNames.ImageData] is System.DBNull == false)
{
base.ImageData = product.ImageData;
if (rowIsDirty == false)
{
base.AcceptChanges();
}
}
}
}
return base.ImageData;
}
set
{
base.ImageData = value;
}
}
興味深い部分は、基になる DataTable DataColumn コレクションに列を追加する場所です。
this.Row.Table.Columns.Add(ProductMetadata.ColumnNames.ImageData, typeof(byte[]));
ES の現行 (およびオープン ソース) 版 (バージョン 2012-09-30) に更新したときに、そのアクセサーから ADO.net 関連のものをすべてコメント アウトする必要がありました。つまり、「ImageData」列が正しく構成されておらず、データを変更してエンティティを保存しようとすると、次のエラーが表示されます。
列「ImageData」はテーブルに属していません。
私はESソースを調べて実験するのに数日を費やしましたが、エンティティをサポートするためにDataTableを使用しなくなり、代わりに「esSmartDictionary」を使用しているようです.
私の質問は次のとおりです。新しいバージョンの ES で機能していたのと同じ遅延読み込み動作を実現する、既知のサポートされている方法はありますか? ORM にエンティティ バッキング ストアに追加するように指示することで、最初の選択に含まれていなかったプロパティ (つまり、列) をどこで更新できますか?