首先是循环外键代码

时间:2015-02-13 17:18:50

标签: asp.net entity-framework ef-code-first asp.net-identity

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

  1. 现有用户添加新用户。
  2. 此操作在用户表中创建一行,在链接的批准表中创建一行。
  3. 当用户登录时,如果他们尚未获得批准,则会被拒绝。
  4. 问题是我收到以下错误

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

    任何帮助都会很棒。

1 个答案:

答案 0 :(得分:2)

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

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

我建议您查看以下链接:

更新

好吧,如果你想创建一个双向可选的一对一关系,你可以使用Fluent Api来做到这一点:

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