EF6 Code First Entity с коллекцией свойств навигации того же типа - как я могу сказать EF, какова связь?

c# entity-framework entity-framework-6 navigation-properties relationships

Вопрос

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

TBLGRADES

GRADEID GUID  (PK)                   | GRADETITLE VARCHAR
--------------------------------------------------------------
882349d4-2564-4160-a034-2a5116dec389 | Cool Grade

59539804-5c47-46ac-873d-65b33ce6ac94 | Not so cool grade

b00d6cdd-3273-4f83-8d18-0c9e9a3e1562 | Lame Grade

TBLGRADESRELATIONSHIPS

GRADEID GUID  (PK)                   | GRADETITLE VARCHAR
--------------------------------------------------------------
882349d4-2564-4160-a034-2a5116dec389 | Cool Grade

59539804-5c47-46ac-873d-65b33ce6ac94 | Not so cool grade

b00d6cdd-3273-4f83-8d18-0c9e9a3e1562 | Lame Grade

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

ОРГАНИЗАЦИЯ

GRADEID GUID  (PK)                   | GRADETITLE VARCHAR
--------------------------------------------------------------
882349d4-2564-4160-a034-2a5116dec389 | Cool Grade

59539804-5c47-46ac-873d-65b33ce6ac94 | Not so cool grade

b00d6cdd-3273-4f83-8d18-0c9e9a3e1562 | Lame Grade

Я бы просто хотел, чтобы экземпляр класса Grade представлял класс Cool, чтобы иметь коллекцию объектов класса (EligibleGrades) (счет: 2) с 1 экземпляром не столь классного класса и 1 экземпляр хромого класса в соответствии с TBLGRADESRELATIONSHIPS.

GRADEID GUID  (PK)                   | GRADETITLE VARCHAR
--------------------------------------------------------------
882349d4-2564-4160-a034-2a5116dec389 | Cool Grade

59539804-5c47-46ac-873d-65b33ce6ac94 | Not so cool grade

b00d6cdd-3273-4f83-8d18-0c9e9a3e1562 | Lame Grade

Пожалуйста, помогите мне понять ассоциации, чтобы я мог работать так. Ценить это. Моя первая публикация SO, пожалуйста, будьте осторожны.

Принятый ответ

Это (саморегуляция) отношение «многие ко многим»: класс может иметь много подходящих оценок, а степень может быть подходящей для многих других классов. Вы можете думать об этом, как если бы у Grade была другая (скрытая) коллекция, например:

public class Grade
{
    public GUID GradeId { get; set; }
    public string GradeTitle { get; set; }
    public virtual ICollection<Grade> EligibleGrades { get; set; }
    public virtual ICollection<Grade> GradesThisIsAnEligibleGradeFor { get; set; }
}

Название настолько уродливое, что мы просто удалим сборку снова. Но вы все еще должны сказать EF, что отношения - это многие ко многим. Если обнаружение модели Code-First видит только одну коллекцию, она всегда предполагает отношение « один ко многим» (с внешним ключом в таблице TBLGRADES , которая не существует). Вы должны переопределить соглашения по умолчанию, используя Fluent API, чтобы вместо этого создать отношения « многие-ко-многим» :

public class Grade
{
    public GUID GradeId { get; set; }
    public string GradeTitle { get; set; }
    public virtual ICollection<Grade> EligibleGrades { get; set; }
    public virtual ICollection<Grade> GradesThisIsAnEligibleGradeFor { get; set; }
}

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




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему