如何在 EF Core 8 中对多对多关系执行 OnDelete(DeleteBehavior.Restrict)?

问题描述 投票:0回答:1

我有一堂课叫

Language
:

public class Language : ValueObject
{
    private List<LanguageType> _typesOfLanguage;

    public IEnumerable<LanguageType> TypesOfLanguage => _typesOfLanguage.AsReadOnly();
}

我的实体类型配置是:

    public class LanguageEntityTypeConfiguration : IEntityTypeConfiguration<Language>
    {
        public void Configure(EntityTypeBuilder<Language> configuration)
        {
            configuration.HasMany(lang => lang.TypesOfLanguage)
                         .WithMany()
                         .OnDelete(DeleteBehavior.Restrict);
         }
     }

我无法构建,因为

OnDelete()
导致以下问题:

CollectionCollectionBuilder不包含“OnDelete”的定义,并且找不到接受“CollectionCollectionBuilder”类型的第一个参数的可扩展扩展方法“OnDelete”

如何限制多对多关系的删除?

entity-framework-core ef-core-8.0
1个回答
0
投票

可以在 docs 中读到,此方法存在于类型

ReferenceCollectionBuilder
上,而不是
CollectionCollectionBuilder<,>
上。

您需要创建外键关系才能指定删除操作。

您可以通过定义自定义联结实体来完成此操作(请参阅联结表,如下所示:

public class StudentClass
{
    public Guid StudentId { get; set; }
    public Student Student { get; set; }
    public Guid ClassId { get; set; }
    public Class Class { get; set; }
}

public class Class
{
    public Guid Id { get; set; }
    public string Subject { get; set; }
    public virtual ICollection<StudentClass> StudentClasses { get; set; }
}

public class Student
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<StudentClass> StudentClasses { get; set; }
}

public class ConsoleContext : DbContext
{
    public DbSet<Class> Classes { get; set; }
    public DbSet<Student> Students { get; set; }
    public DbSet<StudentClass> StudentClasses { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer();
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<StudentClass>()
            .HasKey(x => new { x.StudentId, x.ClassId });

        modelBuilder.Entity<StudentClass>()
            .HasOne(c => c.Student)
            .WithMany(x => x.StudentClasses)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<StudentClass>()
            .HasOne(c => c.Class)
            .WithMany(x => x.StudentClasses)
            .OnDelete(DeleteBehavior.Restrict);

        base.OnModelCreating(modelBuilder);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.