Сопоставить один и тот же класс модели для нескольких целей в Entity FrameWork

у меня есть два класса моделей, один из которых ApplicationUser и второй Appointment. Пользователь приложения включает всех пользователей, которые используют приложение, в моем случае врачей и операторов ввода данных. Врачи будут назначены каждому назначению, и операторы ввода данных будут делать этот журнал в БД. Я хочу сопоставить обоих этих пользователей с назначением. Я пробовал что-то вроде этого

public class Appointment
{
    public int AppointmentID { get; set; }
    public DateTime Date { get; set; }

    public int DoctorID { get; set; }
    [ForeignKey("DoctorID")]
    public virtual ApplicationUser Doctor { get; set; }

    public int SystemUserID { get; set; }
    public virtual ApplicationUser SystemUser { get; set; }
}

public class ApplicationUser : IdentityUser
{
    public string Email { get; set; }
    public string Mobile { get; set; }
    public string FirstNsme { get; set; }
    public string LastName { get; set; }
}

но это вызывает ошибку

Appointment_Doctor_Target_Appointment_doctor_source:: типы всех свойств в зависимой роли ссылочного ограничения должны совпадать с соответствующими типами свойств в главной роли. Тип собственности DoctorID на назначение объекта не соответствует типу код по сущности ApplicationUser '' в Appointment_Doctor референциальных ограничений''.

кто-нибудь может указать, почему эта ошибка возникает и что является правильным подход к этой проблеме?

3 ответов


IdentityUser как все сущности в asp.net Identity entity framework имеют string как ключ. Вы пытаетесь отобразить на int. Поэтому либо используйте GUID в качестве внешних ключей в вашей сущности назначения

public class Appointment
{
    [Key]
    public int AppointmentID { get; set; }
    public DateTime Date { get; set; }

    public string DoctorID { get; set; }
    [ForeignKey("DoctorID")]
    public virtual ApplicationUser Doctor { get; set; }

    public string SystemUserID { get; set; }
    [ForeignKey("SystemUserID ")]
    public virtual ApplicationUser SystemUser { get; set; }
}

или измените тип идентификаторов в классах идентификаторов на int. Вы можете найти помощь здесь.


в ваших классах есть несколько проблем.

что такое DoctorID? Где это определено?

сначала вам нужно сосредоточиться на установлении правильных отношений между вашими сущностями логически.

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

во-вторых, если вы хотите поделиться некоторыми свойствами между двумя типами пользователей, чем создать общий класс и наследовать в Doctor и SystemUser.

добавить DoctorId в таблицу врача вместе с конкретными деталями, относящимися к врачу, например специальности.

SystemUser добавляет встречу, поэтому таблица должна содержать данные, связанные с этим, т. е. doctorId и appointmentId.

обновление:

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

public class Appointment
{
    public int AppointmentID { get; set; }
    public DateTime Date { get; set; }

    public int DoctorID { get; set; }
    [ForeignKey("ApplicationUserId")]
    public virtual ApplicationUser Doctor { get; set; }

    public int SystemUserID { get; set; }
    [ForeignKey("ApplicationUserId")]
    public virtual ApplicationUser SystemUser { get; set; }
}

public class ApplicationUser
{
    public int ApplicationUserId { get; set; }
    public string Email { get; set; }
    public string Mobile { get; set; }
    public string FirstNsme { get; set; }
    public string LastName { get; set; }
    public UserType UserType { get; set; }
}

public enum UserType
{
    Doctor,
    SystemUser
}

ДАЛЕЕ И БОЛЕЕ СЛОЖНАЯ ОШИБКА:

У меня была эта ошибка несколько раз через 4 связанные таблицы.

каждая таблица имела составные ключи 3-7 полей, и одна таблица ссылалась на свой собственный ключ 3-поля с другим сочетанием своих собственных столбцов.

Я веками боролся с фиксацией одной последовательности полей (которая исправляет ошибку, как упоминалось в других сообщениях) только для того, чтобы иметь эффект стука в других сущностях.

решение: выровнять все связано поля FK таблиц в порядке уменьшения вхождения

первоначально: enter image description here

ПОСЛЕ ВЫРАВНИВАНИЯ КЛЮЧЕВЫХ ПОЛЕЙ: enter image description here

и повторно упорядочил все анонимные объекты FK в FluentAPI в DbContext в соответствии с новым порядком.

это исправило все головные боли.