我有一堂课叫
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”
如何限制多对多关系的删除?
可以在 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);
}
}