我正在使用 C# 和 .NET Framework 4.5.1 开发 Entity Framework Code First 6.1.3 库。
我有这三个表:
还有这些 EntityTypeConfiguration
文件:
类CHILDSConfiguration
:
class AGGREGATION_CHILDSConfiguration : EntityTypeConfiguration<AGGREGATION_CHILDS>
{
public AGGREGATION_CHILDSConfiguration()
{
HasKey(ag_ch => ag_ch.CHILD_CODE);
Property(ag_ch => ag_ch.CHILD_CODE)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Property(ag_ch => ag_ch.CHILD_CODE)
.HasMaxLength(20)
.IsRequired()
.HasColumnName("CODE");
Property(ag_ch => ag_ch.PARENT_CODE)
.HasMaxLength(20)
.IsRequired();
HasRequired(ag_ch => ag_ch.Aggregation)
.WithMany(ag => ag.AggregationChilds)
.HasForeignKey(ag_ch => ag_ch.PARENT_CODE);
HasRequired(ag_ch => ag_ch.Code)
.WithOptional(c => c.AggregationChild)
.WillCascadeOnDelete(false);
}
}
类AGGREGATIONSConfiguration
:
class AGGREGATIONSConfiguration : EntityTypeConfiguration<AGGREGATIONS>
{
public AGGREGATIONSConfiguration()
{
HasKey(ag => ag.PARENT_CODE);
Property(ag => ag.PARENT_CODE)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Property(ag => ag.PARENT_CODE)
.HasMaxLength(20)
.IsRequired()
.HasColumnName("CODE");
Property(ag => ag.CREATED)
.HasMaxLength(50)
.IsOptional();
HasRequired(ag => ag.Code)
.WithOptional(c => c.Aggregation)
.WillCascadeOnDelete(false);
}
}
类CODESConfiguration
:
class CODESConfiguration : EntityTypeConfiguration<CODES>
{
public CODESConfiguration()
{
HasKey(c => c.CODE);
Property(c => c.CODE)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
Property(c => c.CODE)
.HasMaxLength(20);
Property(c => c.CODE_LEVEL)
.IsRequired();
Property(c => c.COMMISIONING_FLAG)
.IsRequired();
Property(c => c.IS_TRANSMITTED)
.IsRequired();
Property(c => c.TIMESPAN)
.HasMaxLength(50)
.IsOptional();
Property(c => c.USERNAME)
.HasMaxLength(50)
.IsOptional();
Property(c => c.SOURCE)
.HasMaxLength(50)
.IsOptional();
Property(c => c.REASON)
.HasMaxLength(200)
.IsOptional();
Property(c => c.ALTERNATE_CODE)
.IsOptional();
Property(c => c.HELPER_CODE)
.IsOptional();
}
}
我想这样做:如果我删除 CODES
表上的一行,我想删除 AGGREGATIONS
和 AGGREGATION_CHILDS
上的代码表。
我如何使用 Entity Framework Code First 做到这一点?
我必须添加 .WillCascadeOnDelete(false);
因为我收到有关循环和多级联路由的错误。
最佳答案
这个错误好几次差点从 window 看到我的笔记本电脑……基本上它不工作的原因是this ...但好消息是,我们可以通过删除已经隐式定义的关系来解决这个问题。
这种关系是您可以完全删除的关系:
AggregationsChild > HasRequired > Code
原因是Aggregation
与AggregationChild
有一对多
关系
Aggregation > HasMany > AggregationChild
Aggregation
也依赖于 Code
Aggregation > HasRequired > Code
既然 AggregationChild
是 Aggregation
的子项,而 Aggregation
是 Code
的子项。从 AggregationChild
到 Code
的额外依赖正在创建多个级联路径,因此将其完全删除,这应该可以解决您的问题...
要找出 AggregationChild
属于哪个 Code
,您首先需要获取 AggregationChild
的父级,然后导航到Code
实体通过 Aggregation
....
var aggregationChild = this.AggregationChildren.Include("Aggregation.Code")
.First(ac => ac.Id == 123);
var code = aggregationChild.Aggregation.Code;
关于c# - 使用 EF Code First 级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30076630/