【问题标题】:Error: Unable to determine composite primary key ordering for type错误:无法确定类型的复合主键排序
【发布时间】:2015-12-17 12:31:10
【问题描述】:

我尝试为我的 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 在阅读了一些 cmets 后,我删除了

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

它仍然给我与上面给我相同的错误。

【问题讨论】:

  • 请不要在您的问题中加入“卡住”或“帮助”;我们知道您需要帮助并且您遇到了困难,否则您不会问这个问题。
  • @GeorgeStocker 感谢您的宝贵建议。我会记住这一点。
  • 您的客户定义和表中是否有 MembershipClientValidationId、AccountId 和 PassportDetailsId 字段?关系定义将使用它们将表链接在一起。
  • 你也能展示一个 PersonModel 类吗?
  • 您有三个 1:1 关联,其中 ClientModel 似乎是原则,因此其他类应该具有作为 ClientModel 的外键的主键。没有DatabaseGeneratedOption.Identity

标签: c# asp.net entity-framework data-annotations


【解决方案1】:

我通过一些简单的更改解决了这个问题。

我在我的 ClientModel 中删除了我的三个 [ForeignKey("//")]。我参考我的 ClientModel 在我的其他 3 个模型中将 外键 添加到了我的 主键

我接下来要做的是主要修复。我在其他三个模型中的public ClientModel Client { get; set; } 上方添加了[Required]

现在它可以正常工作并构建我的 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; }
}

它只是工作。

【讨论】:

    猜你喜欢
    • 2017-08-07
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多