0

示例情况(我已经更直接地提出了这个问题并且没有收到任何反馈,所以请原谅这个抽象的例子,但我只是想更好地提出这个问题):

为简洁起见(实际模型有数百行)。对数据库进行建模以表示房屋。房子可以有房间、窗户和院子。一个房间可以有家具或电子产品。家具可以是沙发、桌子或椅子。沙发具有图案、材料和尺寸。

F. Bar 先生的房子是 Bar's Crazy Couches 的展示厅。每个月,Bar 先生的房间都会展示数百张沙发。Bar 先生喜欢知道人们何时喜欢他的沙发,并为每个房间设置保留反馈。

Bar 先生的兄弟 Ed 先生运行他的数据库管理系统。埃德先生决定搬走有一段时间没用过的沙发!

假设该删除被接受、存档、或放置在分区中、或标记为非活动的(即它没有被阻止,这是一个选项)。

如何在一个房间中确定这个依赖沙发的缺失,该房间的房间引用了使用 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();

房子将填充正确的房子。它将包括适当的房间。然而,一个房间会提到一张坏掉的沙发。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 回答