【问题标题】:The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Users_Agencies_UserID"INSERT 语句与 FOREIGN KEY 约束“FK_Users_Agencies_UserID”冲突
【发布时间】:2021-05-30 08:01:11
【问题描述】:

我使用实体框架核心 5.0,并使用 fluent api 创建了我的一对多关系。 当我尝试在我的项目中创建一个新用户时,我得到了这个错误。 让我带你去我的User 班级:

    public class User : Base
    {
        [Key]
        public int UserID { get; set; }
        public string UserName { get; set; }
        public string UserSurname { get; set; }
        public string UserPassword { get; set; }
        public string UserEMail { get; set; }
        public int? AgencyID { get; set; }
   
        public virtual Agency Agency { get; set; }
    }
    public class UserConfiguration : IEntityTypeConfiguration<User>
    {
        public void Configure(EntityTypeBuilder<User> builder)
        {
            builder.HasKey(user => user.UserID);

        }
    }

这里是一个与User 类相关的Agency 类:

    public class Agency : Base
    {
        [Key]
        public int AgencyID { get; set; }
        public string AgencyName { get; set; }
        public string AgencyPhoto { get; set; }
        public string AgencyEMail { get; set; }
        public string AgencyPhone { get; set; }
        public int AgencyExportArea { get; set; } 
        public virtual ICollection<User> Users { get; set; }
    }
    public class AgencyConfiguration : IEntityTypeConfiguration<Agency>
    {
        public void Configure(EntityTypeBuilder<Agency> builder)
        {
            builder.HasKey(agency => agency.AgencyID);
            builder.HasMany(us => us.Users)
                .WithOne(us => us.Agency)
                .HasForeignKey(au => au.UserID)
                .IsRequired(false)
        }
    }

我知道,我收到了那个错误SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Users_Agencies_UserID". The conflict occurred in database "anan", table "dbo.Agencies", column 'AgencyID'.,因为Agency 表中没有数据。我试图做的事情是使 AgencyID 外键可选作为可空值。在User 类中,您可以看到我将 AgencyID 定义为可为空的。

我真的需要将这种关系定义为一对一或零,还是有其他方法可以做到这一点?

如果我必须将这种关系定义为一对一或零,你能告诉我如何做到这一点吗?

【问题讨论】:

  • 您使用的是什么版本的 EF 内核?
  • 我使用实体框架核心5.0

标签: c# .net-core entity-framework-core ef-code-first ef-core-5.0


【解决方案1】:

由于您使用的是 EF Core 5,因此您不需要:

public class UserConfiguration : IEntityTypeConfiguration<User>
and 
public class AgencyConfiguration : IEntityTypeConfiguration<Agency>

所有这些代码都是多余的。您有一个标准的一对多关系,EF 核心默认识别和配置。删除所有这些代码,一切都会好起来的。

但如果你是一名学生并且需要努力完成所有事情,你可以添加这个冗余代码:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>(entity =>
            {
                entity.HasOne(d => d.Agency)
                   .WithMany(p => p.Users)
                   .HasForeignKey(d => d.AgencyId)
                   .OnDelete(DeleteBehavior.ClientSetNull);
         });

        }

由于您对配置感兴趣,因此这些是另一个冗余属性:

public class User : Base
    {
        [Key]
        public int UserID { get; set; }
        .....

        public int? AgencyID { get; set; }
        [ForeignKey(nameof(AgencyId))]
        [InverseProperty("Users")]
        public virtual Agency Agency { get; set; }
    }

    public class Agency : Base
    {
        [Key]
        public int AgencyID { get; set; }
         .....
        [InverseProperty(nameof(User.Agency))]
        public virtual ICollection<User> Users { get; set; }
    }

【讨论】:

  • 感谢您的努力。我正在做的主要错误是将外键定义在错误的一侧。现在效果很好,再次感谢!!!
  • 不客气。谢谢你对我来说太过分了。如果您能接受答案,那就太好了。
  • 我知道 efcore 5.0 可以识别大多数关系。我正在做一个大项目,这就是为什么我需要 100% 确定并且我不能让自己认识到每一个关系本身。这就是为什么我不得不使用流利的 api。先生,我已经明白你的意思了,再次感谢!
  • 您必须通过单击复选标记来接受答案。如果你不这样做,迟早人们会停止帮助你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多