Entity Frame Code First 关系约束中 Dependent 和 Principal Roles 中的属性数量必须相同

Entity Frame Code First The number of properties in the Dependent and Principal Roles in a relationship constraint must be identical

数据库构建错误:

在模型生成过程中检测到一个或多个验证错误:

AccountLinkPermission_AccountLink_Target_AccountLinkPermission_AccountLink_Source: : 关系约束中从属角色和主要角色中的属性数必须相同。

用户class:

public class User
{
    public User()
    {
        AccountLinks = new HashSet<AccountLink>();
    }

    [Key]
    public int UserID { get; set; }

    public virtual ICollection<AccountLink> AccountLinks { get; set; }
}

访客class:

public class Guest
{
    public Guest()
    {
        AccountLinks = new HashSet<AccountLink>();
    }

    [Key]
    public int GuestID { get; set; }

    public virtual ICollection<AccountLink> AccountLinks { get; set; }
}

账户链接class:

public class AccountLink
    {
        public AccountLink()
        {
            AccountLinkPermissions = new HashSet<AccountLinkPermission>();
        }

        public AccountLink(int userID, int guestID)
        {
            this.UserID = userID;
            this.GuestID = guestID;
        }

        [Key, Column(Order = 0)]
        public int AccountLinkID { get; set; }
        [Key, Column(Order = 1)]
        public int UserID { get; set; }
        [Key, Column(Order = 2)]
        public int GuestID { get; set; }

        [ForeignKey("UserID")]
        public virtual User User { get; set; }

        [ForeignKey("GuestID")]
        public virtual Guest Guest { get; set; }

        public virtual ICollection<AccountLinkPermission> AccountLinkPermissions { get; set; }
    }

AccountLinkPermissionclass:

public class AccountLinkPermission
{
    public AccountLinkPermission(int accountLinkID, int permissionID)
    {
        this.AccountLinkID = accountLinkID;
        this.PermissionID = permissionID;
    }

    [Key, Column(Order = 0)]
    public int AccountLinkID { get; set; }
    [Key, Column(Order = 1)]
    public int PermissionID { get; set; }

    [ForeignKey("AccountLinkID")]
    public virtual AccountLink AccountLink { get; set; }

    [ForeignKey("PermissionID")]
    public virtual Permission Permission { get; set; }
}

权限class:

public class Permission
{
    public Permission()
    {
        AccountLinkPermissions = new HashSet<AccountLinkPermission>();
    }

    [Key]
    public int PermissionID { get; set; }
    public string Name { get; set; }

    public virtual ICollection<AccountLinkPermission> AccountLinkPermissions { get; set; }
}

问题:

它不允许我在 AccountLinkPermission、AccountLinkID 和 AccountLink、AccountLinkID 之间放置外键。如果我删除数据库构建的 ForeignKey 属性,但两者之间没有外键。

为什么这不起作用?这让我疯狂。请帮助我..

我认为这与您的数据有关annotations.You不要使用 [Key]

标记您的外键属性

AccountLink.cs

    [Key, Column(Order = 0)]
    public int AccountLinkID { get; set; }
    [Column(Order = 1)]
    public int UserID { get; set; }
    [Column(Order = 2)]
    public int GuestID { get; set; }

    [ForeignKey("UserID")]
    public virtual User User { get; set; }

    [ForeignKey("GuestID")]
    public virtual Guest Guest { get; set; }

AccountLinkPermission.cs

[Key, Column(Order = 0)]
public int AccountLinkPermissionID { get; set; }
[Column(Order = 1)]
public int AccountLinkID { get; set; }
[Column(Order = 2)]
public int PermissionID { get; set; }

[ForeignKey("AccountLinkID")]
public virtual AccountLink AccountLink { get; set; }

[ForeignKey("PermissionID")]
public virtual Permission Permission { get; set; }

其他一切看起来都很好。希望有帮助

我收到此错误消息的原因是因为 AccountLink 有三个主键。因为我只声明了一个从 AccountLinkPermission 到 AccountLink 的外键 (AccountLinkID),所以它失败了。我还必须为 UserID 和 GuestID 设置外键。

此外,如果您使用链接到同一个 table 的多个外键,EF 无法按照惯例确定哪些导航属性属于一起。我不得不使用 [InverseProperty],而不是使用 属性 [ForeignKey],它在关系的另一端定义导航 属性。

更改内容如下:

帐号链接:

public class AccountLink
{
    public AccountLink()
    {
        AccountLinkPermissionAccountLinkID = new HashSet<AccountLinkPermission>();
        AccountLinkPermissionUserID = new HashSet<AccountLinkPermission>();
        AccountLinkPermissionGuestID = new HashSet<AccountLinkPermission>();
    }

    public AccountLink(int userID, int guestID)
    {
        AccountLinkPermissionAccountLinkID = new HashSet<AccountLinkPermission>();
        AccountLinkPermissionUserID = new HashSet<AccountLinkPermission>();
        AccountLinkPermissionGuestID = new HashSet<AccountLinkPermission>();
        this.UserID = userID;
        this.GuestID = guestID;
    }

    [Key, Column(Order = 0)]
    public int AccountLinkID { get; set; }
    [Key, Column(Order = 1)]
    public int UserID { get; set; }
    [Key, Column(Order = 2)]
    public int GuestID { get; set; }

    [ForeignKey("UserID")]
    public virtual User User { get; set; }

    [ForeignKey("GuestID")]
    public virtual Guest Guest { get; set; }

    public virtual ICollection<AccountLinkPermission> AccountLinkPermissionAccountLinkID { get; set; }
    public virtual ICollection<AccountLinkPermission> AccountLinkPermissionUserID { get; set; }
    public virtual ICollection<AccountLinkPermission> AccountLinkPermissionGuestID { get; set; }
}

AccountLinkPermission:

public class AccountLinkPermission
        {
            public AccountLinkPermission(int accountLinkID, int userID, int guestID, int permissionID)
            {
                this.AccountLinkID = accountLinkID;
                this.UserID = userID;
                this.GuestID = guestID;
                this.PermissionID = permissionID;
            }

            [Key, Column(Order = 0)]
            public int AccountLinkID { get; set; }
            [Key, Column(Order = 1)]
            public int UserID { get; set; }
            [Key, Column(Order = 2)]
            public int GuestID { get; set; }
            [Key, Column(Order = 3)]
            public int PermissionID { get; set; }

            [InverseProperty("AccountLinkPermissionAccountLinkID")]
            public virtual AccountLink AccountLink { get; set; }

            [InverseProperty("AccountLinkPermissionUserID")]
            public virtual AccountLink AccountLinkUser { get; set; }

            [InverseProperty("AccountLinkPermissionGuestID")]
            public virtual AccountLink AccountLinkGuest { get; set; }

            [ForeignKey("PermissionID")]
            public virtual Permission Permission { get; set; }
        }