C# EF核心:级联删除的多对多关系
我正在使用EF Core(代码优先)进行一个.NET Core项目。我正在构建一个API来学习这个框架 总之,该应用程序将允许用户粘贴代码并与其他用户共享。 因此,我有两个主要实体:C# EF核心:级联删除的多对多关系,c#,.net,entity-framework,entity-framework-core,C#,.net,Entity Framework,Entity Framework Core,我正在使用EF Core(代码优先)进行一个.NET Core项目。我正在构建一个API来学习这个框架 总之,该应用程序将允许用户粘贴代码并与其他用户共享。 因此,我有两个主要实体: 使用者 列表项 代码页 public sealed class User : Entity<Guid> { /// <summary> /// Le nom d'utilisateur de l'utilisateur /// &
- 使用者
- 列表项
public sealed class User : Entity<Guid>
{
/// <summary>
/// Le nom d'utilisateur de l'utilisateur
/// </summary>
public string Username { get; private set; }
/// <summary>
/// Le hash du mot de passe de l'utilisateur
/// </summary>
public byte[] PasswordHash { get; private set; }
/// <summary>
/// Le salt du mot de passe de l'utilisateur
/// </summary>
public byte[] PasswordSalt { get; private set; }
/// <summary>
/// Liste de pages de code dont l'utilisateur est proprietaire
/// </summary>
public ICollection<CodePage> OwnedCodePages { get; private set; }
/// <summary>
/// Association User/Page autorisées
/// </summary>
public ICollection<UserCodePage> UserCodePages { get; private set; }
...
}
以及实体配置:
internal class UserCodePage : BaseEntityTypeConfiguration<Identity.Entities.UserCodePage>
{
public override void Configure(EntityTypeBuilder<Identity.Entities.UserCodePage> builder)
{
builder.HasKey(o => new { o.AuthorizedUserId, o.CodePageId });
builder
.HasOne(o => o.AuthorizedUser)
.WithMany(o => o.UserCodePages)
.HasForeignKey(o => o.AuthorizedUserId)
.OnDelete(DeleteBehavior.Restrict);
builder
.HasOne(o => o.CodePage)
.WithMany(o => o.UserCodePages)
.HasForeignKey(o => o.CodePageId)
.OnDelete(DeleteBehavior.Restrict);
}
内部类UserCodePage:BaseEntityTypeConfiguration
{
公共覆盖无效配置(EntityTypeBuilder)
{
HasKey(o=>new{o.AuthorizedUserId,o.CodePageId});
建设者
.HasOne(o=>o.duser)
.WithMany(o=>o.UserCodePages)
.HasForeignKey(o=>o.AuthorizedUserId)
.OnDelete(DeleteBehavior.Restrict);
建设者
.HasOne(o=>o.CodePage)
.WithMany(o=>o.UserCodePages)
.HasForeignKey(o=>o.CodePageId)
.OnDelete(DeleteBehavior.Restrict);
}
我添加了OnDelete(DeleteBehavior.Restrict)
,因为没有它我无法更新数据库
问题是:
如果用户
或链接到它的代码页
被删除,我希望删除用户代码页
。
我试图使用删除行为.Cascade
但是更新数据库
失败
我希望您理解我的问题!它是否说明了在使用更新数据库时失败的原因?我看到您的代码页
中有第三个关系称为UserCodePage
。如果这另一个关系依赖于它,则您无法删除它,因为外键失败。另一个关系是用户对代码页上的一对多关系。(一个代码页有一个所有者,一个用户有多个拥有的代码页)我的意思是确切的错误?如果您可以提供,我的计算机上没有我,但这是这样的:表上的外键约束可能会导致循环或多个级联路径,这意味着您必须将另一个关联配置为删除行为.Restrict
。
public class UserCodePage : BaseEntity
{
public Guid AuthorizedUserId { get; private set; }
public User AuthorizedUser { get; set; }
public Guid CodePageId { get; private set; }
public CodePage CodePage { get; set; }
public UserCodePage()
{
}
public UserCodePage(Guid userId, User user, Guid codePageId, CodePage codePage)
{
AuthorizedUserId = userId;
AuthorizedUser = user;
CodePageId = codePageId;
CodePage = codePage;
}
}
internal class UserCodePage : BaseEntityTypeConfiguration<Identity.Entities.UserCodePage>
{
public override void Configure(EntityTypeBuilder<Identity.Entities.UserCodePage> builder)
{
builder.HasKey(o => new { o.AuthorizedUserId, o.CodePageId });
builder
.HasOne(o => o.AuthorizedUser)
.WithMany(o => o.UserCodePages)
.HasForeignKey(o => o.AuthorizedUserId)
.OnDelete(DeleteBehavior.Restrict);
builder
.HasOne(o => o.CodePage)
.WithMany(o => o.UserCodePages)
.HasForeignKey(o => o.CodePageId)
.OnDelete(DeleteBehavior.Restrict);
}