c# - 使用 EF Code First 级联删除

标签 c# entity-framework

我正在使用 C# 和 .NET Framework 4.5.1 开发 Entity Framework Code First 6.1.3 库。

我有这三个表: enter image description here

还有这些 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 表上的一行,我想删除 AGGREGATIONSAGGREGATION_CHILDS 上的代码表。

我如何使用 Entity Framework Code First 做到这一点?

我必须添加 .WillCascadeOnDelete(false); 因为我收到有关循环和多级联路由的错误。

最佳答案

这个错误好几次差点从 window 看到我的笔记本电脑……基本上它不工作的原因是this ...但好消息是,我们可以通过删除已经隐式定义的关系来解决这个问题。

这种关系是您可以完全删除的关系:

AggregationsChild > HasRequired > Code

原因是AggregationAggregationChild一对多关系

Aggregation > HasMany > AggregationChild

Aggregation 也依赖于 Code

Aggregation > HasRequired > Code

既然 AggregationChildAggregation 的子项,而 AggregationCode 的子项。从 AggregationChildCode 的额外依赖正在创建多个级联路径,因此将其完全删除,这应该可以解决您的问题...

要找出 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/

相关文章:

java - C#和Java访问静态变量和方法的区别

c# - 将 Collection<dynamic> 转换为 Collection<double> 的最佳方法?

c# - 如何使用 MathNet Numerics 获取按数量级列出的向量形式的特征值?

c# - 为什么对 ASP.NET MVC Controller 的调用不执行 DelegatingHandler?

c# - 生成 Entity Framework 模型耗时过长

c# - Entity Framework 的通用存储库方法出错

c# - 为什么我不能在 Entity Framework 中使用字典

c# - 从数据库加载大块数据时如何避免 OutOfMemoryException?

c# - IQueryable 到底是什么意思?

c# - 我们可以使用代码优先迁移运行 SQL 脚本吗?