2015-02-10 3 views
5

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

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: : The types of all properties in the Dependent Role of a referential constraint must be the same as the corresponding property types in the Principal Role. The type of property 'DoctorID' on entity 'Appointment' does not match the type of property 'Id' on entity 'ApplicationUser' in the referential constraint 'Appointment_Doctor'.

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

ответ

10

IdentityUser как все сущности в инфраструктуре идентификации идентификатора asp.net имеют string как ключ. Вы пытаетесь сопоставить int. Так что либо использовать Guids как внешние ключи в вашем Назначение лица

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; } 
} 

или изменить тип ИДС в классах идентичности в целое. Вы можете найти справку here.

+0

Теперь ошибка изменилась. Appointment_Doctor_Target_Appointment_Doctor_Source:: Типы всех свойств зависимой роли ссылочного ограничения должны быть такими же, как соответствующие типы свойств в главной роли. Тип свойства «DoctorID» в сущности «Назначение» не соответствует типу свойства «Идентификатор» в сущности «ApplicationUser» в ссылочном ограничении «Назначение_Доктор». Appointment_SystemUser_Target_Appointment_SystemUser_Source: – Athul

+0

..... Appointment_Doctor_Target_Appointment_Doctor_Source:: Типы всех свойств зависимой роли ссылочного ограничения должны быть такими же, как соответствующие типы свойств в главной роли. Тип свойства «DoctorID» в сущности «Назначение» не соответствует типу свойства «Идентификатор» в сущности «ApplicationUser» в ссылочном ограничении «Назначение_Доктор». Appointment_SystemUser_Target_Appointment_SystemUser_Source: – Athul

+0

@Athul Мне очень жаль. Необходимо использовать строку не Guid. – tmg

3

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

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

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

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

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

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

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

Update:

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

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 
} 
+0

вместо добавления SystemUserID, который добавил встречу. как я мог отследить, кто назначил встречу? – Athul

+0

DoctorID определяется в Назначениях? – Athul

+0

Я не хочу создавать новую таблицу только для врача, так как я уже сохраняю все данные в приложении Пользователь – Athul

0

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

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

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

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

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

своеобразно: enter image description here

ПОСЛЕ КЛЮЧЕВЫХ ОБЛАСТЯХ выравнивали: enter image description here

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

Это фиксировало все головные боли.

Смежные вопросы