Entity Framework 6 необязательное одностороннее отношение

У меня есть две таблицы:

Client
------------------------
Id           (string) <-- PrimaryKey
Name         (string)
Number       (int)

Department:*
------------------------
Id           (int) <-- Primary key
Name         (string)
ClientNumber (int?)
Client       (Client, virtual)
.....

Теперь я хочу создать необязательное отношение от Департамента к клиенту (используя ClientNumber). Я создал виртуальную собственность в классе Департамента (Клиент), и теперь мне нужно настроить отношение, используя EntityTypeConfiguration.

В базе данных нет внешних ключей, и я не могу изменить базу данных. Я также не могу изменить клиент Entity (class).

Поэтому мне нужно сообщить EntityFramework, что ClientNumber в классе Department связан (необязательно) с свойством Number в классе Client.

Но я не могу понять, как сообщить EF, что номер клиента отдела связан с свойством Client Number, а не с Первичным ключом клиента. (без изменения класса объекта Client)

edit: Свойство Number на клиенте уникально для каждой записи.

Отношение должно приводить к выражению sql следующим образом:

SELECT .....
FROM Department D LEFT OUTER JOIN Client C ON (D.ClientNumber = C.Number)

Это легко сделать, используя объединения в Linq, но было бы здорово:

dbContext.Departments.Include(d => d.Client) 

используя виртуальное свойство в классе Департамента, содержащем Клиент (если есть)

Ответ 2

Извините, это невозможно. Валидские отношения в EF также должны быть действительными в базе данных, другими словами, зависимая таблица должна ссылаться на уникальный идентификатор в главной таблице. В противном случае система не может обеспечить, чтобы на одном отделении было не более одного клиента.

Ответ 3

В качестве обходного решения вы могли бы добавить свойство ClientId и ClientNumber? Вы можете получить доступ к ClientNumber из свойства виртуального клиента после проверки того, что Клиент не равен null:

    public class Client
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public int Number { get; set; }
    }

    public class Department 
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string ClientId { get; set; }

        public virtual Client Client { get; set; }

        [NotMapped]
        public int? ClientNumber {
            get {
                return Client != null ? Client.Number : null;
            }
        }
    }