3

親行が削除されたときに、Db内のすべての子を削除する2つの列間のFK関係をセットアップしようとしています。私は、これはFKSの実装が動作しているよう思わ伝えることができるものから、Mango SQL CE:DeleteRule = "カスケード"が機能しない

[Table] 
    public class Parent 
    { 
     [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)] 
     public int Id { get; set; } 

     [Column] 
     public string Dummy 
     { 
      get { return "dummy"; } 
      set { } 
     } 

     private EntitySet<Child> _children; 

     [Association(Name = "FK_Parent_Child", DeleteRule = "CASCADE", OtherKey = "ParentId", ThisKey="Id", Storage="_children")] 
     public EntitySet<Child> Children 
     { 
      get 
      { 
       return _children; 
      } 
      set 
      { 
       _children.Assign(value); 
      } 
     } 

     public Parent() 
     { 
      _children = new EntitySet<Child>(
       item => item.Parent = this, 
       item => item.Parent = null); 
     } 
    } 

    [Table] 
public class Child 
{ 
    [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)] 
    public int Id { get; set; } 

    [Column] 
    public int? ParentId { get; set; } 

    private EntityRef<Parent> _parent; 
    [Association(Name="FK_Child_Parent", ThisKey = "ParentId", Storage = "_parent", OtherKey = "Id", IsForeignKey = true, DeleteRule="CASCADE")] 
    public Parent Parent 
    { 
     get 
     { 
      return _parent.Entity; 
     } 
     set 
     { 
      var previousValue = _parent.Entity; 
      if (previousValue != value || !this._parent.HasLoadedOrAssignedValue) 
      { 
       if (previousValue != null) 
        _parent.Entity = null; 

       _parent.Entity = value; 
       if (value != null) 
        ParentId = value.Id; 
       else 
        ParentId = null; 
      } 
     } 
    } 

} 

:私の定義は次のようになり。 Dbに親行を追加すると、自動的に子行が追加されます。親の行を選択すると、すべての関連する子でChildrenプロパティが正しく埋められます。

また、データベースの親行を削除して、その削除で関連するすべての子を削除することもできます。この設定では、親を削除すると「このキーへの参照が存在するため、主キー値を削除できません。[外部キー制約名= FK_Child_Parent]」というエラーが表示されます。

DeleteRule = "Cascade"は受け入れられないようですが、その理由はわかりません。

+0

エミュレータからデータベースファイルを抽出し、制約をスクリプト化して、CASCADEルールが作成されているかどうかを確認します。 – ErikEJ

+1

同様の問題が発生しました。 DataContext.Logにログリスナーを添付した後、ON CASCADE DELETE制約が作成されていないことがわかりました。属性のプロパティの異なる組み合わせを再生した後、私はあきらめた。 Windows Phone用Linq2SQLの場合DeleteRule = "CASCADE"はDB内に制約を作成していません! :/ – rObiwahn

答えて

1

私はそれが非常に遅いことを知っていますが、私は同じ問題を抱えていました。これは私が見つけた最初の投稿でした。 私が言いたいのは、すべてが機能しているということです。

ルール名を大文字にする必要はありません。親エンティティでDeleteRuleを設定します。

ここに私の作業コードです。

親エンティティフィールド。

private EntitySet<ExerciseDataContext> _exercises = new EntitySet<ExerciseDataContext>(); 

    [Association(Name = Constants.ForeignKeysNames.KF_GROUP_EXERCISE, Storage = "_exercises", OtherKey = "GroupID", ThisKey = "ID", DeleteRule = "Cascade")] 
    public ICollection<ExerciseDataContext> Exercises 
    { 
     get { return _exercises; } 
     set { _exercises.Assign(value); } 
    } 

子エンティティフィールド。

private EntityRef<GroupDataContext> _group = new EntityRef<GroupDataContext>(); 

    [Association(Name = Constants.ForeignKeysNames.KF_GROUP_EXERCISE, IsForeignKey = true, Storage = "_group", ThisKey = "GroupID")] 
    public GroupDataContext Group 
    { 
     get { return _group.Entity; } 
     set { _group.Entity = value; } 
    } 

誰かを助けることを願っています。

+0

ありがとうございます –

関連する問題