EntityFramework 4 では、次からエンティティを取得する正しい方法
は
どれ
ですか?
エンティティにlinqを使用して、現在データベースにあるデータを取得します。
を使用してObjectStateManager.GetObjectStateEntries(entityState).Select(ent => ent.Entity).OfType<IEntityWithKey>()
、(必要に応じて)追加および/または削除を取得します
エンティティへのlinqを使用すると、クエリ結果に削除されたオブジェクトが表示されるため、グリッドビューに表示されます(ModifiedおよびUnchangedと同様)が、これは私が望むものではなく、削除されたオブジェクトは必要ありません。
私が必要としているのは、削除されたオブジェクトと、メモリ内に追加されたオブジェクトを除いて、現在データベースにあるすべてのデータをグリッドビューに表示することです。(これはすべて、Savechanges を呼び出す前に行われます)。
型指定されたコレクションを返し、それに gridview データソースを設定する BL クラスのメソッドがあります。
これを達成するために、私は次のことを行います:
- db データを取得するためのエンティティへの linq (たとえば Collection1)、
- GetObjectStateEntries(Deleted) を使用して削除されたエンティティ (Collection2) を取得する、
- GetObjectStateEntries(Added) を使用して新しいメモリ内に追加されたものを取得する (Collection3 )
次に Collection1.ToList() を繰り返して Collection2 のアイテムを削除し、次に Collection3 との Union を削除します。
それは機能しますが、私はそれが好きではありません。
それを行うためのより良い/適切な方法はありますか? ヘルプ/提案はありますか?
事前にサンクス。
ここにいくつかのコードがあります。
データベース エンティティを取得する方法 (削除されたオブジェクトはここに含まれます):
public IEnumerable<ConnectorTransformationLookUpConceptData> GetConnectorTransformationLookUpConceptsView(int idConnectorTransformation)
{
var data = from r in Entities.ConnectorTransformationLookUpConcept
join c in Entities.LookUpConcept on r.IdLookUpConcept equals c.IdLookUpConcept
....
return ExcludeDeleted(data).Union(AddedData(idConnectorTransformation)).OrderBy(e => e.Concept);
}
削除されたオブジェクトを削除する方法 (前のリターンで呼び出されます) :
private List<ConnectorTransformationLookUpConceptData> ExcludeDeleted(IEnumerable<ConnectorTransformationLookUpConceptData> collection)
{
List<ConnectorTransformationLookUpConceptData> l = collection.ToList();
var deleted = GetDeletedEntities<ConnectorTransformationLookUpConcept>();
foreach (ConnectorTransformationLookUpConcept d in deleted)
{
ConnectorTransformationLookUpConceptData o = l.Find(c => c.idConnTransf == d.IdConnectorTransformation && c.idLooUpConcept == d.IdLookUpConcept);
if (o != null) l.Remove(o);
}
return l;
}
前の "AddedData" および "GetDeletedEntities" 呼び出しによって最終的に呼び出されるメソッド。目的のオブジェクトを返します (EntityState.Added または EntityState.Deleted 内)。
protected IEnumerable<IEntityWithKey> GetEntities<IEntityWithKey>(EntityState entityState)
{
IEnumerable<IEntityWithKey> data =
this.Entities.ObjectStateManager.
GetObjectStateEntries(entityState).
Select(ent => ent.Entity).
OfType<IEntityWithKey>();
return data;
}