2016-08-02 12 views
0

2つのエンティティUnitおよびUnitPerUnitがあります。それらの役割は次のとおりMVC 4エンティティフレームワーク同じテーブルへの2つの外部キー原因サイクルまたは複数のカスケードパス

  • Unit
  • UnitPerUnit ...等キロメーター、センチメートル、庭、等の単位を定義します(例:1キロ= 1000gr)単位の間の値を保持

ここでは、コードは次のようになります。

[Table("EA_Unit", Schema = "EAccounting")] 
public class EA_Unit 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    [Display(Name = "Unit Id")] 
    public int UnitId { get; set; } 

    [Display(Name = "Unit Name")] 
    [Index("UnitName", IsUnique = true)] 
    [MaxLength(20)] 
    [Required] 
    public string UnitName { get; set; } //Example kg, piece, roll, yard, meter 

    public EA_Unit() 
    { 
     UnitName = ""; 
    } 
} 

[Table("EA_UnitPerUnit", Schema = "EAccounting")] 
public class EA_UnitPerUnit 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    [Display(Name = "Unit Per Unit Id")] 
    public int UnitPerUnitId { get; set; } 

    [Display(Name = "From Unit")] 
    [Required] 
    [Index("UnitToUnit", 1, IsUnique = true)] 
    public int UnitId { get; set; } 

    [Display(Name = "To Name")] 
    [Required] 
    [Index("UnitToUnit", 2, IsUnique = true)] 
    public int UnitToUnit { get; set; } //The comparer unit 

    [Display(Name = "Amount")] 
    [Required] 
    public float UnitAmount { get; set; } //how much is this unit to another unit (ex: 1kg = 1000gr) 

    [ForeignKey("UnitId")] 
    public virtual EA_Unit Unit { get; set; } 

    [ForeignKey("UnitToUnit")] 
    public virtual EA_Unit UnitTo { get; set; } 

    public EA_UnitPerUnit() 
    { 
     UnitId = 0; 
     UnitToUnit = 0; 
     UnitAmount = 0; 
    } 
} 

私はプログラムを実行し、データベースを作成するたびに、このエラーがあります:

'EA_UnitPerUnit'テーブルのFOREIGN KEY制約 'FK_EAccounting.EA_UnitPerUnit_EAccounting.EA_Unit_UnitToUnit'を導入すると、サイクルまたは複数のカスケードパスが発生する可能性があります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。 制約を作成できませんでした。以前のエラーを参照してください。

は、私が欲しいのはUnitが削除された場合、その値を保持UnitPerUnitエントリも削除されますpublic virtual EA_Unit Unit { get; set; }またはpublic virtual EA_Unit UnitTo { get; set; }のいずれかでUnitを削除しています。

どうすればこの問題を解決できますか?私はデータベースがUnitPerUnitのエントリを自動的に削除するようにデータベースを設定したいのですが、Unitのエントリが削除された後にそれを削除します。

+1

1 FK非カスケードを行います。 –

答えて

1

この問題は何度も解決されました。 this answerを参照してください。

カスケード削除と外部キーは、親 テーブルのレコードが削除された場合、子テーブル で対応するレコードが自動的に削除されることを意味します。これは、SQL サーバーでカスケード削除と呼ばれます。

参考文献link

これを解決するには、モデルビルダーを使用する必要があります。

modelBuilder.Entity<...>() 
      .HasRequired(...) 
      .WithMany(...) 
      .HasForeignKey(...) 
      .WillCascadeOnDelete(false); 

または

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
+0

UnitPerUnitまたはUnitにモデルビルダーを追加する必要がありますか? EA_UnitはUnitPerUnitの情報を持たないので、それ自身のためのデータしか持たない。 –

+0

EA_UnitPerUnitはエラー時に述べたとおりです。 –

+0

私が間違っていると私を訂正してください。私のモデルの問題は、2つの外部キーがあり、同じユニットにカスケードしてカスケードして、ユニットが削除された場合にシステムが2回チェックすることです。システムでは、解決策はちょうど削除権利にカスケードしている1つの外部キーを持つことですか?おそらく、カスケードしていない他の外部キーがそれにマップされたユニットが削除されている場合は、UnitPerUnitを手動で削除する必要がありますか? –

関連する問題