2012-04-10 1 views
0

Пример ситуации (я спросил это более непосредственно и не получил обратную связь, поэтому, пожалуйста, простите абстрактный пример, но я просто пытаюсь поставить вопрос лучше):Как определить, отсутствует ли зависимая от объекта EF?

Для краткости (фактические модели сотни строк). База данных смоделирована для представления домов. В доме могут быть комнаты, окна и дворы. В комнате могут быть мебель или электроника. Мебель может быть диваном, столом или стулом. Кушетка имеет узор, материал и размеры.

Дом г-на Ф. Бар - выставочный зал для сумасшедших диванов в баре. Каждый месяц комнаты г-на Бар показывают сотни кушеток. Г-н Бар любит знать, когда люди любят его кушетки, и обратная связь сохраняется для каждой установки комнаты.

Г-н Эд, брат мистера Бар, управляет своей системой управления базами данных. Г-н Эд решает удалить кушетку, которая не использовалась какое-то время!

Предположим, что это удаление принимается, архивируется или помещается в раздел или помечено как неактивное (то есть оно не блокируется, что является опцией здесь).

Как можно определить отсутствие этого зависимого кушетки в доме, в котором есть комната, которая ссылается на удаленную кушетку из запроса linq с использованием Entity Framework 4.1?

Вызывающий запрос может выглядеть так (для краткости я оставил только актуальные разделы), но у него будет исключение, которое трудно поймать.

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. В этот момент в коде это легко может быть списком многих разных домашних композиций.

Как я могу убедиться, что дом, содержащий комнату, содержащую удаленную кушетку, пойман?

+0

Вы не можете ответить? Они должны быть сделаны вручную, чтобы включить логику для экранирования и не могут быть выполнены через linq. –

+0

Знаете ли вы идентификатор дивана? –

+0

@SteveMallory - Не заранее. –

ответ

1

Как вы можете себе представить, это будет некрасиво. В основном, вам нужно сделать левое соединение, а затем получить доступ ко всем кушеткам из всех возвращенных домов/комнат. Когда вы попытаетесь получить доступ к плохим кушеткам, вы получите:

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); 
} 
+0

Впечатляющий :) Похоже, мне может потребоваться нормализация базы данных, хотя, как я читал, этот тип проблемы свидетельствует о плохом дизайне. –

+0

@TravisJ Я бы определенно рекомендовал иметь внешние ключи между этими таблицами - пусть сервер базы данных выполняет то, что он предназначен для выполнения. Это помешало бы этому сенарио вообще не впасть. –

+0

Реальная проблема здесь - каскадное удаление и последствия этого в реальном мире. Хотя для обеспечения целостности требуется каскадирование, это может вызвать проблемы с удалением важных данных.Избежание подхода каскада (молотка) и просто удаление одной записи (скальпеля) - вот где этот сценарий возникает. Я посмотрел на нормализацию, но моя схема - 5NF, и у меня все еще есть проблема, когда удаление зависимой записи вызывает несогласованность. Промышленным стандартом для этого является либо «не удалять запись», либо «удалить запись и всех, кто когда-либо слышал об этом». –

 Смежные вопросы

  • Нет связанных вопросов^_^