【问题标题】:Circular foreign key code first循环外键码优先
【发布时间】:2015-02-13 17:18:50
【问题描述】:

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

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

任何帮助都会很棒。

【问题讨论】:

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


    【解决方案1】:

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

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

    我建议你检查这个链接:

    更新

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

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

    【讨论】:

    • 同意,但ApplicationUser 是这里唯一可能的主体,因为它们可以在没有Approval 的情况下存在。
    • 是的,问题在于以这种方式链接,它将应用程序用户链接到现有用户,这不是我想要实现的。
    • 你好@RajdeepDosanjh,我已经更新了我的答案。您可以尝试使用这种新的关系配置,希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2013-09-04
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多