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; }
}
数据库构建错误:
在模型生成过程中检测到一个或多个验证错误:
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; }
}