0

状況の例(私はこれをより直接的に尋ね、フィードバックを受け取っていないので、抽象的な例を許してください、しかし私はただ質問をより良く提起しようとしています):

簡潔にするために(実際のモデルは数百行です)。データベースは、家を表すようにモデル化されています。家には部屋、窓、庭を置くことができます。部屋には家具や電子機器を置くことができます。家具はソファ、テーブル、または椅子にすることができます。ソファには、パターン、素材、寸法があります。

F.バー氏の家は、バーズクレイジーカウチのショールームです。毎月、バー氏の部屋には何百ものソファが飾られています。バー氏は、人々がいつ彼のソファが好きかを知るのが好きで、部屋のセットアップごとにフィードバックが保持されます。

バー氏の兄弟であるエド氏は、彼のデータベース管理システムを実行しています。エドさんは、しばらく使われていなかったソファを外そうと決心しました!

この削除が受け入れられるか、アーカイブされるか、パーティションに配置されるか、非アクティブとしてフラグが立てられていると想定します(つまり、ここでのオプションであるブロックされていません)。

Entity Framework 4.1を使用してlinqクエリから削除されたソファを参照する部屋がある家で、この依存ソファがないことをどのように判断できますか?

呼び出し元のクエリは次のようになります(簡潔にするために、トピックの部分のみを残しました)が、キャッチするのが難しい例外があります。

public House getHouse(object id){
 using( DbContext context = new FooBarContext()){
  DbSet<House> dbSet = context.Set<House>();
  IQueryable<House> query = dbSet;
  query = query.Where(h => h.HouseKey == id);
  query = query.Include(h => h.Room);
  query = query.Include(h => h.Room.Couch);
 }
 return query.ToList();
}

var house = getHouse(9).FirstOrDefault();

家には正しい家が表示されます。適切な部屋のセットが含まれます。ただし、1つの部屋には、壊れたソファへの参照があります。この時点try{}catch{}までは、例外はキャッチされません。これは、インデックス番号9の家のみを対象としています。コードのこの時点では、これは多くの異なる家の構成のリストである可能性があります。

取り外したソファのある部屋のある家を確実に捕まえるにはどうすればよいですか?

4

1 に答える 1

1

ご想像のとおり、これはきれいではありません。基本的には、左に参加してから、戻ってきたすべての家/部屋のすべてのソファにアクセスする必要があります。あなたが悪いソファにアクセスしようとすると、あなたは:を得るでしょうSystemException

A relationship multiplicity constraint violation occurred: 
    An EntityReference expected at least one related object, 
    but the query returned no related objects from the data store.

try
{
    var test = (from h in context.Set<House>()
                join r in context.Set<Room>()
                  on h.Room.Id equals r.Id into houseRoom
                from joinHouseRoom in houseRoom.DefaultIfEmpty()
                join c in context.Set<Couch>()
                  on r.Couch.Id equals c.Id into houseRoomCouch
                from joinHouseRoomCouch in houseRoomCouch.DefaultIfEmpty()
                select h).ToList()
                         .Select(x => x.Room.Couch.Material)
                         .ToList();
}
catch(SystemException se)
{
    Console.WriteLine(se.Message);
}
于 2012-04-10T21:38:10.280 に答える