我正在使用C#和.NET Framework 4.5.1开发实体框架代码第一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);
,因为我收到有关周期和多个级联路线的错误。
答案 0 :(得分:1)
这个错误几乎让我的笔记本电脑透过窗户几次......基本上它不起作用的原因是this ......但好消息是,我们可以通过删除来解决这个问题已隐含定义的关系。
这种关系可以完全删除:
AggregationsChild > HasRequired > Code
原因是Aggregation
与One to Many
的关系AggregationChild
Aggregation > HasMany > AggregationChild
Aggregation
也依赖于Code
Aggregation > HasRequired > Code
现在AggregationChild
是Aggregation
的孩子,而Aggregation
是Code
的孩子。从AggregationChild
到Code
的额外依赖是创建多个级联路径,因此请完全删除它,这应该可以解决您的问题......
要找出Code
所属的AggregationChild
,您首先需要获取AggregationChild
的父级,然后导航到Code
实体通过Aggregation
....
var aggregationChild = this.AggregationChildren.Include("Aggregation.Code")
.First(ac => ac.Id == 123);
var code = aggregationChild.Aggregation.Code;