INSERT 语句与 FOREIGN KEY 约束冲突 "FK_Users_Agencies_UserID"
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Users_Agencies_UserID"
我使用 entity framework 核心 5.0,我用流利的 api 创建了我的一对多关系。
当我尝试在我的项目中创建新用户时出现该错误。
让我带你看看我的 User
class:
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);
}
}
这里是 Agency
class 与 User
class:
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
table 中没有数据。我想做的是使 AgencyID
外键可选为可为空。在 User
class 中,您可以看到我将 AgencyID
定义为可为空。
我真的需要将这种关系定义为一对一或零,还是有另一种方法可以做到这一点?
如果我必须将这种关系定义为一对一或零,你能告诉我怎么做吗?
由于您使用的是 EF 核心 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; }
}
我使用 entity framework 核心 5.0,我用流利的 api 创建了我的一对多关系。
当我尝试在我的项目中创建新用户时出现该错误。
让我带你看看我的 User
class:
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);
}
}
这里是 Agency
class 与 User
class:
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
table 中没有数据。我想做的是使 AgencyID
外键可选为可为空。在 User
class 中,您可以看到我将 AgencyID
定义为可为空。
我真的需要将这种关系定义为一对一或零,还是有另一种方法可以做到这一点?
如果我必须将这种关系定义为一对一或零,你能告诉我怎么做吗?
由于您使用的是 EF 核心 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; }
}