2015-09-21 3 views
0

Я застрял в старой базе данных с несколькими представлениями и таблицами, в основном с правильными значениями внешнего ключа. Однако некоторые из этих «внешних ключей» не имеют значения NULL, поэтому DBA в своей бесконечной мудрости решил использовать «0» вместо нуля.Внешние ключи, которые не существуют

В этом примере OWNERID в CAR будет установлен в 0 вместо нуля, если автомобиль не имеет владельца. Когда EF пытается получить все автомобили, будут возвращены только автомобили с действительным OwnerId, а те, у которых 0, остались без внимания.

[Table("CAR")] 
public class Car { 
     [Key, Column("CARID")] 
     public int CarId { get;set;} 
     [Column("OWNERID")] 
     public int OwnerId { get;set;} 

     [ForeignKey("OwnerId")] 
     public virtual Owner {get;set;} 
} 

[Table("OWNER"] 
public class Owner { 
     [Key, Column("OWNERID")] 
     public int Id {get;set;} 
} 

Запрос:

var allCars = context.Cars.Include(c => c.Owner).ToList(); 

Это дает только автомобили с действительной OwnerId (> 0) в ответ. В настоящее время, я «решить» это, делая два запроса, как это:

var carsWithOwner = context.Cars.Include(c => c.Owner).Where(c => c.OwnerId > 0).ToList(); 
    var carsWithoutOwner = context.Cars.Where(c => c.OwnerId == 0).ToList(); 

Любые указатели или рекомендации, что делать? Я хотел бы получить все автомобили взамен, а с Owner установлен в null, где OwnerId равен 0.

Я не могу изменить базу данных.

+0

'с => c.OwnerId> = 0 'Вы могли бы использовать его? –

+0

Спасибо, это была хорошая идея, но проблема осталась прежней. (Пробовал здесь сейчас). – Larsbj

+0

кажется, что он производит внутреннее соединение с помощью поля ownerid. Может быть, вы можете добавить запись в таблицу Owner с ID = 0? и проверьте его позже в своем коде. к сожалению, я не знаю C#, но может быть возможно создать левое внешнее соединение. Автомобили с владельцем –

ответ

1

Если вы не позволили владельцу быть нулевым, вы все равно должны изменить свою модель EF.

[Column("OWNERID")] 
public int? OwnerId { get;set;} 

На данный момент ваша проблема должна быть решена, как Include использует LEFT JOIN, если внешний ключ обнуляемый. Автомобильных дорог с ownerId = 0 должно быть Owner Навигационная система имеет значение NULL.

Если это все еще не работает, вы можете создать представление поверх существующей таблицы и запросить это. Я знаю, что вы заявили, что не можете изменять базу данных, но я предполагаю, что это означает, что вы не можете изменить существующую схему таблиц.

1) Создать вид vw_CAR

CREATE VIEW vw_CAR 
AS 
SELECT 
    CARID, 
    CASE WHEN OWNERID = 0 THEN NULL ELSE OWNERID END AS OWNERID 
FROM 
    CAR 

2) Изменение таблицы для просмотра

[Table("vw_CAR")] 
+0

Большое вам спасибо. Так очевидно, но все же так сложно разобраться в себе. Решение с изменением значения внешнего ключа на значение nullable отлично работает здесь. – Larsbj

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