Ошибка: невозможно определить порядок составного первичного ключа для типа

Я пытаюсь создать контроллер для моей ClientModel, и он выдает ошибку:

Произошла ошибка при запуске выбранного генератора кода: "Невозможно получить метаданные для" /////.ClientModel ". Невозможно определить составной первичный ключ для заказа для типа '/////.ClientModel'. Используйте ColumnAttribute (ссылка) или метод HasKey (ссылка), чтобы указать порядок составных первичных ключей.

У меня есть три класса, каждый из которых имеет отношение один-к-одному с моим классом клиента.

Это моя ClientModel:

[Table("Client")]
public class ClientModel : PersonModel
{
    [Key(), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ClientId { get; set; }
    [Required]
    public string FirstName { get; set; }
    public string Initials { get; set; }
    [Required]
    public string LastName { get; set; }
    //... snip ...
    [Required]
    public long ClientIdentificationNumber { get; set; }
    public virtual PassportDetailsModel Passport { get; set; }
    public virtual MembershipClientValidationModel Membership { get; set; }
    public virtual AccountClientModel Account { get; set; }
}

Паспортный класс:

[Table("Passport")]
public class PassportDetailsModel
{
    [Key(), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid PassportDetailsId { get; set; }
    [Required]
    public string IssuingCountry { get; set; }
    [Required]
    public DateTime Issued { get; set; }
    [Required]
    public DateTime ExpirationDate { get; set; }
    public virtual ClientModel Client { get; set; }
}

Класс аккаунта:

  [Table("AccountClient")]
public class AccountClientModel
{
    [Key(), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid AccountId { get; set; }
    [Required]
    public string Username { get; set; }
    [Required]
    public string Password { get; set; }
    public virtual ClientModel Client { get; set; }
}

Класс членства:

[Table("MembershipClientValidation")]
public class MembershipClientValidationModel
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid MembershipClientValidationId { get; set; }
    public DateTime MembershipStartDate { get; set; }
    public DateTime MembershipExpiryDate { get; set; }
    public bool IsMembershipValid { get; set; }
    [Required]
    public virtual ClientModel Client { get; set; }
}

Я не понимаю, как исправить "неспособность получить метаданные для <class> ошибка. Как связать классы с помощью составных ключей?


21-09-2015 После прочтения некоторых комментариев я удалил

DatabaseGenerated.DatabaseOption.Identity

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

        [ForeignKey("Passport")]
    public Guid PassportDetailsId { get; set; }
    public virtual PassportDetailsModel Passport { get; set; }

    [ForeignKey("Membership")]
    public Guid MembershipClientValidationId { get; set; }
    public virtual MembershipClientValidationModel Membership { get; set; }

    [ForeignKey("Account")]
    public Guid AccountClientId { get; set; }
    public virtual AccountClientModel Account { get; set; }

Это все еще дает мне ту же ошибку, что и выше.

1 ответ

Решение

Я исправил эту проблему, сделав несколько простых изменений.

Я снял свою тройку [ForeignKey("//")] в моей ClientModel. Я добавил Внешние ключи к своим Первичным ключам в моих других 3 моделях со ссылкой на мою ClientModel.

То, что я сделал дальше, было основным исправлением. я добавил [Required] выше public ClientModel Client { get; set; } в моих трех других моделях.

Теперь он работает и защищает мой ClientController без ошибок. Итак, чтобы показать пример одной из трех других моделей:

public class MembershipClientValidationModel
{
    [Key]
    [ForeignKey("Client")]
    public Guid ClientId { get; set; }
    public DateTime MembershipStartDate { get; set; }
    public DateTime MembershipExpiryDate { get; set; }
    public bool IsMembershipValid { get; set; }
    [Required]
    public virtual ClientModel Client { get; set; }
}

Это просто работает.

Другие вопросы по тегам