2017-02-22 31 views
0

我试图理解和EF信任。 我有表的数据库,我试图复制与EFCode-First技术大部分结构作为练习练习自己的基础知识。多DataAnnotation ForeignKeys循环或多个级联路径异常

我所有的课都“HB”作为其名称的前缀。 我想写属性名称上没有'Hb'的其他类的对象引用。

我的这个site

后续指令第一批实施的事业例外,如:

引进国外KEY约束 'FK_Common.HbZipcode_Common.HbCountry_CountryId' 表 'HbZipcode' 可能导致周期或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY 约束。无法创建约束或索引。请参阅前面的 错误。

[Required, ForeignKey("Country")] 
public int CountryId { get; set; } 
public virtual HbCountry Country { get; set; } 

[Required, ForeignKey("State")] 
public int StateId { get; set; } 
public virtual HbState State { get; set; } 

[Required, ForeignKey("City")] 
public int CityId { get; set; } 
public virtual HbCity City { get; set; } 

// This Foreignkey never throw exception 
[ForeignKey("Neighborhood")] 
public int? NeighborhoodId { get; set; } 
public virtual HbNeighborhood Neighborhood { get; set; } 

我做错了,我看不到。
如果任何人都可以帮助我,那会很好。

编辑:

应用由通过plushpuffin解决方案后,一切都如预期。
下面的代码:

var modelConfig = dbModelBuilder.Entity<HbZipcode>(); 
modelConfig 
    .HasRequired(zc => zc.Country) 
    .WithMany(c => c.Zipcodes) 
    .HasForeignKey(zc => zc.CountryId) 
    .WillCascadeOnDelete(false); 

modelConfig 
    .HasRequired(zc => zc.State) 
    .WithMany(s => s.Zipcodes) 
    .HasForeignKey(zc => zc.StateId) 
    .WillCascadeOnDelete(false); 

modelConfig 
    .HasOptional(zc => zc.Neighborhood) 
    .WithMany(n => n.Zipcodes) 
    .HasForeignKey(zc => zc.NeighborhoodId) 
    .WillCascadeOnDelete(false); 

Delete cascadeHbZipcodeHbCity被删除

现在只发生

回答

1

这里发生的事情是,HbZipCode有外键的多个表,你不能创建2+外键具有ON CASCADE DELETE的约束,可以使用多种方法从同一个表中删除相同的行。

这很可能是您的实体类被设置为当HbZipCode被删除时,它会将删除级联到HbNeighborhood,然后是HbCity,然后是HbState,然后是HbCountry。如果在ON CASCADE DELETE指向HbCity的情况下向HbZipCode添加了另一个外键,则删除HbZipCode记录将导致直接级联删除到HbNeighborhood并直接级联删除到HbCity,但HbNeighborhood被删除将会导致级联删除至HbCity。

你需要做的是解决多阶通过关闭CASCADE删除大部分删除路径HbCity和其他实体类型。

this MSDN page上一口流利的配置。

这可能是你想要的东西是这样的:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<HbZipCode>() 
     .HasRequired(t => t.HbCity) 
     .WithMany(t => t.HbZipCodes) 
     .HasForeignKey(t => t.CityId) 
     .WillCascadeOnDelete(false); 
} 
+0

我说错删除的方向。这是HbNeighborhood(等)被删除,将级联删除HbZipCode。对于那个很抱歉。 – plushpuffin

+0

所以我想象它是建议删除所有“CASCADE”约束和明确的更新和删除对象现在......对吗? –

+0

您可能希望在最直接的路径上保留一组具有级联删除的触发器。这一切都取决于你的需求。 – plushpuffin

相关问题