Entity Framework с проблемой MVVM. Нарушение ограничения PRIMARY KEY Дублирующее значение ключа равно (2, 2) - PullRequest
0 голосов
/ 14 января 2020

Я возился с этим в течение 5 часов и сдался.

Раньше я делал в основном такие же отношения и работал, и теперь, когда я сохраняю в своем проекте MVVM, я получаю эту ошибку:

SqlException: Нарушение ограничения PRIMARY KEY 'PK_dbo.LecturerMeeting'. Невозможно вставить дубликат ключа в объект «dbo.LecturerMeeting». Значение дубликата ключа (2, 2).

А также:

Произошла ошибка при сохранении сущностей, которые не предоставляют свойства внешнего ключа для своих отношений. Свойство EntityEntries вернет значение NULL, поскольку один объект не может быть определен как источник исключения. Обработка исключений при сохранении может быть упрощена путем предоставления свойств внешнего ключа в типах объектов. Подробности смотрите в InnerException.

У меня есть 2 класса моделей, Meeting и Lecturer. В Lecturer классе я определяю в конструкторе:

public Lecturer()
{
    Meetings = new Collection<Meeting>();
}

А также

public ICollection<Meeting> Meetings { get; set; }

То же самое в Meeting классе

public Meeting()
{
    Students = new Collection<Student>();
    Lecturers= new Collection<Lecturer>();
}

И:

public ICollection<Lecturer> Lecturers { get; set; }

Но когда я создал отношения «многие ко многим» между встречами и учеником, EF создал таблицу MeetingStudent.

Теперь он создал LecturerMeeting, не знаю, изменит ли это что-нибудь

SQL код для LecturerMeeting отношений:

CREATE TABLE [dbo].[LecturerMeeting] 
(
    [Lecturer_Id] INT NOT NULL,
    [Meeting_Id]  INT NOT NULL,
    CONSTRAINT [PK_dbo.LecturerMeeting] PRIMARY KEY CLUSTERED ([Lecturer_Id] ASC, [Meeting_Id] ASC),
    CONSTRAINT [FK_dbo.LecturerMeeting_dbo.Lecturer_Lecturer_Id] FOREIGN KEY ([Lecturer_Id]) REFERENCES [dbo].[Lecturer] ([Id]) ON DELETE CASCADE,
    CONSTRAINT [FK_dbo.LecturerMeeting_dbo.Meeting_Meeting_Id] FOREIGN KEY ([Meeting_Id]) REFERENCES [dbo].[Meeting] ([Id]) ON DELETE CASCADE
);
GO

CREATE NONCLUSTERED INDEX [IX_Lecturer_Id]
    ON [dbo].[LecturerMeeting]([Lecturer_Id] ASC);
GO

CREATE NONCLUSTERED INDEX [IX_Meeting_Id]
    ON [dbo].[LecturerMeeting]([Meeting_Id] ASC);

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 14 января 2020

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

public async override Task<Meeting> GetByIdAsync(int id)
        {
            return await Context.Meetings.Include(m => m.Students).SingleAsync(m => m.Id == id); 

Из-за:

public async override Task<Meeting> GetByIdAsync(int id)
        {
            return await Context.Meetings.Include(m => m.Students).Include(m => m.Lecturers)
                .SingleAsync(m => m.Id == id); 
        }

Слишком глуп, чтобы найти это быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...