2015-05-06 5 views
2

Я разрабатываю код Entity Framework First 6.1.3 с C# и .NET Framework 4.5.1.Каскад при удалении с использованием кода EF Сначала

У меня есть эти три таблицы: 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 таблицы, я хочу, чтобы удалить этот код на AGGREGATIONS и на AGGREGATION_CHILDS столе.

Как это сделать, используя First Entity Framework Code?

Мне пришлось добавить .WillCascadeOnDelete(false);, потому что я получаю сообщение об ошибках в циклах и нескольких каскадных маршрутах.

ответ

1

Эта ошибка почти видела мой ноутбук через окно несколько раз ... в основном причина, почему он не работает this ... Но хорошая новость заключается в том, что мы можем исправить это, удалив отношения, которые уже неявно определены ,

Это соотношение является тот, который вы можете полностью удалить:

AggregationsChild > HasRequired > Code 

Причина заключается в том, что Aggregation имеет One to Many отношения с AggregationChild

Aggregation > HasMany > AggregationChild 

Aggregation также имеет зависимость от Code

Aggregation > HasRequired > Code 

С AggregationChild является ребенком Aggregation, а Aggregation является ребенком Code. Дополнительная зависимость от AggregationChild к Code создает несколько путей каскадных, поэтому удалить его полностью, и это должно исправить ваши проблемы ...

Чтобы узнать, какие CodeAggregationChild является частью, вы будете в первую очередь необходимо получить родитель AggregationChild, а затем перейти к Code сущности через Aggregation ....

var aggregationChild = this.AggregationChildren.Include("Aggregation.Code") 
               .First(ac => ac.Id == 123); 
var code = aggregationChild.Aggregation.Code;