Entity Framework Code First: Как я могу смоделировать этот простой сценарий рефералов? - PullRequest
0 голосов
/ 14 октября 2011

Я пытаюсь смоделировать то, что кажется относительно простым реферальным сценарием.Я пытался искать, но я не совсем уверен, как зовут те отношения, которые я ищу, чтобы создать.

Вот объяснение:

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

Вот код:

// Model
public class Student
{
    public int? ReferralID { get; set; }
    public virtual Referral Referral { get; set; }

    public virtual ICollection<Referral> Referrals { get; set; }
}

public class Referral
{
    public int ReferringStudentID { get; set; }
    public virtual Student ReferringStudent { get; set; }

    public int ReferredStudentID { get; set; }
    public virtual Student ReferredStudent { get; set; }
}

// Context
modelBuilder.Entity<Student>()
    .HasOptional(x => x.Referral)
    .WithMany()
    .HasForeignKey(x => x.ReferralID);

modelBuilder.Entity<Student>()
    .HasMany(x => x.Referrals)
    .WithRequired(x => x.ReferringStudent)
    .HasForeignKey(x => x.ReferringStudentID);

Здесьявляется полученной базой данных:

Missing a key

Вопрос:

Что можно сделать, чтобы Entity Framework распознал, что ReferringStudentID долженбыть внешним ключом?Я попытался использовать свободный API, чтобы описать отношения между рефералом и студентом, но результаты те же.Я что-то не так делаю?

Заранее спасибо!:)

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Проблема в том, что EF пытается создать внешние ключи с каскадным удалением.В вашей таблице рефералов есть два внешних ключа, которые нельзя обнулить.Это сформирует несколько путей удаления, если вы удалите студента.Это не разрешено SQL Server.

Измените сопоставление внешнего ключа с помощью ReferringStudentID следующим образом

        modelBuilder.Entity<Student>()
            .HasMany(x => x.Referrals)
            .WithRequired(x => x.ReferringStudent)
            .HasForeignKey(x => x.ReferringStudentID)
            .WillCascadeOnDelete(false);

Вам нужно подумать, как сохранить целостность ссылок, если вы разрешитеудалить студентов.

0 голосов
/ 14 октября 2011

Сначала я не работал с кодом, правда.Однако мне кажется, что вы создаете два класса, когда вам нужен только один.Если бы я проектировал эту структуру в SQL DDL, она выглядела бы примерно так:

CREATE TABLE Students
(
    StudentId INT IDENTITY NOT NULL PRIMARY KEY,
    ReferredBy INT NULL REFERENCES Students (StudentId)
)

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

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

...