先循环外键代码
Circular foreign key code first
我正在创建一个系统,要求用户批准应用程序中的操作。其中一项操作是添加用户,工作流程如下。
- 现有用户添加新用户。
- 此操作在用户 table 中创建一行,并在链接批准 table 中创建一行。
- 当用户登录时,如果他们没有被批准,它将被拒绝。
问题是我收到以下错误
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; }
}
任何帮助都会很棒。
问题是你试图创建一个一对一的关系,但是,在这种关系中,Entity Framework要求依赖的主键也是外键key.So,不要把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);
}
我正在创建一个系统,要求用户批准应用程序中的操作。其中一项操作是添加用户,工作流程如下。
- 现有用户添加新用户。
- 此操作在用户 table 中创建一行,并在链接批准 table 中创建一行。
- 当用户登录时,如果他们没有被批准,它将被拒绝。
问题是我收到以下错误
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; }
}
任何帮助都会很棒。
问题是你试图创建一个一对一的关系,但是,在这种关系中,Entity Framework要求依赖的主键也是外键key.So,不要把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);
}