当父实体被删除时,我正在尝试使用EF Core的Fluent APIOnDelete
方法来删除依赖实体,如图所示。
我正在DbContext
课上尝试做以下操作:
protected override void OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder modelBuilder)
{
modelBuilder.Entity<Product>()
.HasOne(u => u.Nutrition)
.OnDelete(DeleteBehavior.Delete);
}
}
这就是我被困了几个小时的地方,因为我在OnDelete
和DeleteBehavior
下面看到了一条令人讨厌的红色歪歪扭扭的线,下面有两条错误消息。
'ReferenceAviationBuilder<产品,营养>'不包含"OnDelete"的定义,并且没有可访问的扩展方法"OnDelete"接受类型的第一个参数'引用导航生成器<产品,营养>'可以找到(是否缺少using指令或程序集参考?(
"删除行为"不包含"删除"的定义
这就是我的模型:
public class Product
{
[Key]
public int ProductId { get; set; }
public string ProductName { get; set; }
public string ProductType { get; set; }
public Nutrition ProductNutrition { get; set; }
}
public class Nutrition
{
[Key]
public int NutritionId { get; set; }
public string Ingredients { get; set; }
}
当我把光标放在modelBuilder.Entity
上时,我看到它是一个Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder
。当我在这里查看该类的文档时,我没有看到OnDelete
方法。我做错了什么?其他人是如何随意使用OnDelete
方法而没有问题的?
以下是我项目中的包列表:
- Microsoft.EntityFrameworkCore(3.1.4(
- Microsoft.EntityFrameworkCore.抽象(3.1.4(
- Microsoft.EntityFrameworkCore.Relational(3.1.4(
- Npgsql(4.1.3.1(
想明白了。
OnDelete
方法仅适用于WithOne
和WithMany
方法。换句话说,在定义关系时有必要使用Has/With模式,如下所述:https://www.learnentityframeworkcore.com/configuration/fluent-api/hasone-method
所以。。。在我可以做任何其他事情之前,我必须返回并更改我的Nutrition
类,以包含对父类的引用,如下所示:
public class Nutrition
{
[Key]
public int NutritionId { get; set; }
public string Ingredients { get; set; }
public Product Product { get; set; } //added this
}
然后在我的OnModelCreating
方法中,我可以这样做:
modelBuilder.Entity<Product>()
.HasOne(a => a.ProductNutrition)
.WithOne(b => b.Product)
.OnDelete(DeleteBehavior.Cascade);
这定义了Product和Nutrition之间的一对一关系,现在我可以使用OnDelete
方法设置DeleteBehavior
。