Невозможно вставить явное значение для столбца идентификации в «DentalProcedures», если для параметра IDENTITY_INSERT установлено значение OFF. Код EF первый - PullRequest
0 голосов
/ 02 мая 2020

Я постараюсь сделать это коротким. Любая помощь приветствуется и ценится!

У меня есть 2 класса, которые имеют отношение многие ко многим и их класс составного ключа. Когда я создаю новое «назначение», я хочу выбрать «стоматологические процедуры», которые есть в системе.

Все работает нормально, пока не попадаю в AppointmentRepository, где я пытаюсь сохранить вновь созданную встречу. Ошибка как указано.

Я пытался добавить

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

или

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]

над свойством DentalProcedureId в классе DentalProcedure, но ничего не работает. Сохранены изменения и удалены таблицы, удалены все миграции и т. Д. c.

Класс DentalProcedure:

public class DentalProcedure
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int DentalProcedureId { get; set; }
    [Required(ErrorMessage = "The name of the procedure must be specified")]
    public string ProcedureName { get; set; }
    [Required(ErrorMessage = "The price of the procedure must be specified")]
    public decimal ProcedurePrice { get; set; }
    public bool isEnabled { get; set; }

    public List<CustomerProcedure> CustomerProcedures { get; set; }
    public List<AppointmentProcedure> AppointmentProcedures { get; set; }
}

Класс назначения:

public class Appointment
{
    [Key]
    public int AppointmentId { get; set; }
    [Required]
    public DateTime AppointmentStart { get; set; }
    [Required]
    public DateTime AppointmentEnd   { get; set; }

    [Required]
    public string Title { get; set; }
    public string ProcedureDescription { get; set; } 

    public int CustomerId { get; set; }
    public Customer Customer { get; set; }

    public int WorkDaysId { get; set; }
    public WorkDays WorkDays { get; set; }

    public List<AppointmentProcedure> AppointmentProcedures { get; set; }
}

Класс AppointmentProcedure:

public class AppointmentProcedure
{
    public int AppointmentId { get; set; }
    public Appointment Appointment { get; set; }

    public int DentalProcedureId { get; set; }
    public DentalProcedure DentalProcedure { get; set; }

    public bool ProcedureAppointmentCanceled { get; set; }
}

Домашний контроллер:

 Appointment appointment = new Appointment
                {
                    AppointmentStart = model.AppointmentStart,
                    AppointmentEnd = model.AppointmentEnd,
                    Title = model.Title,
                    ProcedureDescription = model.ProcedureDescription,
                    CustomerId = Id,
                    WorkDaysId =  workkWeek.WorkDaysId,
                };

foreach (var proc in model.DentalProcedures)
{
    if (proc.isEnabled)
    {
        appointment.AppointmentProcedures = new List<AppointmentProcedure>
                        {
                            new AppointmentProcedure
                            {
                                Appointment = appointment,
                                DentalProcedure = proc,
                                ProcedureAppointmentCanceled = false
                            }
                        };
    }
}

_appointment.CreateAppointment(appointment);

И ошибка:

Error message

Еще раз спасибо заранее.

PS: Я все еще учусь, поэтому, если я забыл что-то упомянуть, Заранее извиняюсь!

1 Ответ

0 голосов
/ 06 мая 2020

Entity Framework необходимо отслеживать объект в базе данных, поэтому вам нужно либо присоединить его, либо (что я обычно предпочитаю делать) загрузить из базы данных. Вот измененный код:

foreach (var proc in model.DentalProcedures)
{
    if (proc.isEnabled)
    {
        //assuming the DBSet is called Procedures
        var dbProc = await db.Procedures.FirstOrDefaultAsync(p => p.DentalProcedureId == id));
        appointment.AppointmentProcedures = new List<AppointmentProcedure>
                        {
                            new AppointmentProcedure
                            {
                                Appointment = appointment,
                                DentalProcedure = dbProc, //now set the loaded entity
                                ProcedureAppointmentCanceled = false
                            }
                        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...