首先循环外键代码



我正在创建一个系统,该系统要求用户批准应用程序中的操作。其中一个操作是添加一个用户,工作流程如下。

  1. 现有用户添加新用户
  2. 此操作在用户表中创建一行,并在链接的审批表中创建行
  3. 当用户登录时,如果他们没有被批准,它将被拒绝

问题是我得到以下错误

ApplicationUser_Approval_Source: : Multiplicity is not valid in Role 'ApplicationUser_Approval_Source' in relationship 'ApplicationUser_Approval'. Because the Dependent Role properties are not the key properties, the upper bound of the multiplicity of the Dependent Role must be '*'.

这似乎是由于一个循环外键我的类如下:

public class Approval
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public bool IsApproved { get; set; }
    public virtual IApprovalAction Action { get; protected set; }
    public virtual ApplicationUser RequestingUser { get; set; }
}
public class ApplicationUser : IdentityUser<string, IdentityUserLogin, ApplicationUserRole, IdentityUserClaim>, IUser, IUser<string>, IApprovalAction
{
    [ForeignKey("Approval")]
    public int ApprovalId { get; set; }
    public virtual Approval Approval { get; set; }
}

任何帮助都会很棒。

问题是您试图创建一对一关系,但在这种关系中,实体框架要求依赖项的主键也是外键。所以,不要将ApprovalId映射为FK,否则,EF要求FK也必须是PK(注释该属性)。

另一个问题是EF不知道谁是你们关系的主要目的。要指定主体是谁,请使用Required属性。例如,如果在Approval属性上添加此属性,则指定要创建ApplicationUser,必须在保存更改后设置Aproval属性,因此在这种情况下,主体是Aproval,依赖项是ApplicationUser

我建议你查看以下链接:

  • 处理一对一关系
  • 在1:1关系中,关联的主端意味着什么在实体框架中

更新

好吧,如果你想创建一个一对一的关系,在双方都是可选的,你可以使用Fluent Api:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<ApplicationUser>()
               .HasOptional(au => au.Aproval)
               .WithOptionalPrincipal(a => a.RequestingUser);
}

相关内容

  • 没有找到相关文章

最新更新