1

Я не совсем понимаю EF, поэтому, пожалуйста, медведь со мной, когда я пытаюсь пробиться сквозь мое невежество и замешательство. У меня есть одно ограничение, я не могу изменить структуру базы данных.EF6 Code First Entity с коллекцией свойств навигации того же типа - как я могу сказать 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 (FK)     | ELIGIBLEGRADEID GUID (FK) 
---------------------------------------------------------------------------- 
882349d4-2564-4160-a034-2a5116dec389 | 59539804-5c47-46ac-873d-65b33ce6ac94 

882349d4-2564-4160-a034-2a5116dec389 | b00d6cdd-3273-4f83-8d18-0c9e9a3e1562 

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

ЛИЦО

[Table("TBLGRADES")] 
public class Grade 
{ 
    public GUID GradeId { get; set; } 
    public string GradeTitle { get; set; } 
    public virtual ICollection<Grade> EligibleGrades { get; set; } 
} 

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

var grade = rep.GetGradeByID(Guid.Parse("882349d4-2564-4160-a034-2a5116dec389")); 
grade.EligibleGrades[0] //Not so cool grade 
grade.EligibleGrades[1] //lame grade 

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

ответ

0

Это отношение (саморегуляция) «многие ко многим»: класс может иметь много подходящих оценок, а степень может быть подходящей для многих других классов. Вы можете думать об этом, как будто 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 для того, чтобы создать отношения с многие-ко-многим вместо:

modelBuilder.Entity<Grade>() 
    .HasMany(g => g.EligibleGrades) 
    .WithMany() // <- parameterless because there's no 2nd (inverse) collection 
    .Map(m => 
    { 
     m.ToTable("TBLGRADESRELATIONSHIPS"); 
     m.MapLeftKey("GRADEID"); 
     m.MapRightKey("ELIGIBLEGRADEID"); 
    }); 

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

+0

Это абсолютно идеально! Что касается параметра WithMany() без параметров, я предполагаю, что если мне нужно пройти по графику, чтобы узнать, к каким классам относится текущий класс, мне нужно будет его настроить? Или я понимаю это неправильно? – user3215462

+0

@ user3215462: Да, тогда вы бы использовали '.WithMany (g => g.GradesThisIsAnEligibleGradeFor)'. – Slauma

+0

Спасибо за помощь. Все получилось идеально – user3215462

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

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