【问题标题】:如何在 EF Core 中正确设置一对零或一关系?
【发布时间】:2022-01-22 15:55:19
【问题描述】:

我正在尝试在 EF Core 3.1 中与 ondelete 级联建立 1 对 0 或 1 关系。

这是必须具有(可选/可为空)FbUser 属性的 IdentityUser(原则实体)的扩展。

 public class PtUser : IdentityUser<int>
    {
        [PersonalData]
        [Column(TypeName = "nvarchar(100)")]
        public string FirstName { get; set; }


        [PersonalData]
        [Column(TypeName = "nvarchar(100)")]
        public string LastName { get; set; }

        public FbUser FbUser { get; set; }

    }
 public class FbUser
    {
        [Key]
        [Required]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public string FbUserId { get; set; }

        public string Name { get; set; }

        public string FbEmail { get; set; }
        
        public PtUser PtUser { get; set; }

        public int PtUserId { get; set; }
    }

我如何配置它,如果 PtUser 已链接他们的 Facebook 帐户,他们的 FbUser.FbUserId 将成为 PtUsers 表中的外键,并且当该 PtUser 被删除时,此删除将级联到关联的 FbUsers 表行。

 public class PtDbContext : IdentityDbContext<PtUser, PtRole, int>
    {
        public PtDbContext(DbContextOptions<PtDbContext> options)
            : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

            builder.Entity<PtUser>()
               .HasOne(a => a.FbUser)
               .WithOne(b => b.PtUser)
               .HasForeignKey<FbUser>(b => b.PtUserId)
               .OnDelete(DeleteBehavior.Cascade);
        }

        public DbSet<FbUser> FbUsers { get; set; }
    }

【问题讨论】:

标签: asp.net-mvc entity-framework asp.net-core entity-framework-core foreign-keys


【解决方案1】:

您可以设置不要求将其设为1到0-1:

builder.Entity<PtUser>()
    .HasOne(a => a.FbUser)
    .WithOne(b => b.PtUser)
    .IsRequired(false)
    .HasForeignKey<FbUser>(b => b.PtUserId)
    .OnDelete(DeleteBehavior.Cascade);

对于模型中的一个关系,我们几乎使用了这个定义。 主要区别在于我们从依赖实体的方向定义了关系,即在您的情况下为 FbUser,因此类似于:

builder.Entity<FbUser>()
    .HasOne(a => a.PtUser)
    .WithOne(b => b.FbUser)
    .IsRequired(false)
    .HasForeignKey(a => a.PtUserId)
    .OnDelete(DeleteBehavior.Cascade);

【讨论】:

  • 谢谢,对您的回答稍作改动,这就是我实现它的方式 builder.Entity(entity => { entity.HasOne(ptuser => ptuser.FbUser) .WithOne( fbuser => fbuser.PtUser) .HasForeignKey(fbuser => fbuser.Id) .OnDelete(DeleteBehavior.Cascade); });
猜你喜欢
  • 2019-07-25
  • 2021-06-25
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 2019-06-27
相关资源
最近更新 更多