C# 理解使用fluent api禁用级联删除
我是asp.net的新手,我正在学习一门课程,我们在其中添加了这一部分 使用以下代码禁用oncascade从相关表中删除的代码:C# 理解使用fluent api禁用级联删除,c#,asp.net,asp.net-mvc,entity-framework,ef-fluent-api,C#,Asp.net,Asp.net Mvc,Entity Framework,Ef Fluent Api,我是asp.net的新手,我正在学习一门课程,我们在其中添加了这一部分 使用以下代码禁用oncascade从相关表中删除的代码: 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasRequired(a=>a.Gig) .有很多 .WillCascadeOnDelete(假); 基于模型创建(modelBuilder); } 我想了解很多部分: 根据我的理解,为什么我们用考勤类型定义实体方法 在创建方法以
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasRequired(a=>a.Gig)
.有很多
.WillCascadeOnDelete(假);
基于模型创建(modelBuilder);
}
我想了解很多部分:
HasRequired
是什么意思,以及有多种方法意味着什么
级联删除时 假设有另一种类型的链接指向您的出席情况。因此,在数据库中,另一种类型(表)将有一个外键指向
考勤
表
如果您试图删除数据表中的考勤
记录,则如果该记录在另一个表中使用,则将失败
使用“级联删除”按钮,将删除除考勤记录之外的所有相关记录
如果未启用级联删除,则删除将失败,因为其他记录需要此考勤记录
实体
无论是从代码生成数据库还是数据库已经存在,表示表的C#类都无法提供所有信息(例如,如果不遵循约定,EF无法知道哪个字段是主键,哪个字段不可为空(请参见下一点),或者表名是否与类名匹配)
使用modelBuilder.Entity()
可以帮助EF构建“数据库外观的内部模型”。在这种情况下,您可以向EF提供有关“出勤”类型的其他信息
因此,您可以警告EF此表位于另一个架构中,或者表名不同
您可能会对所有实体/表执行此操作
IsRequired
(在您的示例中未使用,但我发现IsRequired
,并且需要
,因此我将解释放在这里)
IsRequired
与可空类型一起使用。在数据库中,您可以有一个类型“varchar(x)notnull”,而在C#中,它将是一个“string”。但是字符串在C#中可以为null,因此HasRequired
是一种配置,它会告诉ORM“是的,类型可以为null,但在我的配置中不应该为null”
因此,当EF生成数据库时,类型将为“NOTNULL”,或者当您的EF在调用数据库之前验证实体时,该检查将完成
已要求
它的概念与所需的IsRequired
相同,但有点复杂,因为它是在涉及多个表时使用的。例如,合同和客户,一个合同由一个客户拥有,但一个客户可以有多个合同。因此,在数据库中,Contract表将具有Customer的外键,而在类Contract中,将具有名为Customer的(导航)属性
public class Contract
{
public Customer Customer { get; set; }
}
public class Customer
{
}
modelBuilder.Entity<Contract>()
.HasRequired(c => c.Customer)
在这里,您可以看到Customer类没有合同的(导航)属性。如果您不需要客户对象来达成合同,那么这是非常好的
现在,如果你想拥有这种能力,你需要这样做:
public class Customer
{
public List<Contract> Contracts { get; set; }
}
modelBuilder.Entity<Contract>()
.HasRequired(c => c.Customer)
.WithMany(cu => cu.Contracts)
公共类客户
{
公共列表契约{get;set;}
}
modelBuilder.Entity()
.HasRequired(c=>c.Customer)
.有许多(cu=>cu.合同)
在这种情况下,您表示合同与客户有一种必需的关系,并且从客户对象的角度来看,这种关系会导致“合同”属性。您的标题与您的问题不匹配。你的问题是关于“级联删除”吗?我不确定是否理解您的第一个问题。@Arcord我的第一个问题与modelBuilder有关。Entity我不明白为什么会在此处放置考勤类型谢谢您的回答,但您能否解释一下使用多种方法的目的我编辑了我的邮件。我发现IsRequired和HasRequired,所以我也修复了它:-)
public class Customer
{
public List<Contract> Contracts { get; set; }
}
modelBuilder.Entity<Contract>()
.HasRequired(c => c.Customer)
.WithMany(cu => cu.Contracts)