Сопоставить один и тот же класс модели для нескольких целей в 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 таблиц в порядке уменьшения вхождения
ПОСЛЕ ВЫРАВНИВАНИЯ КЛЮЧЕВЫХ ПОЛЕЙ:
и повторно упорядочил все анонимные объекты FK в FluentAPI в DbContext в соответствии с новым порядком.
это исправило все головные боли.