親行が削除されたときに、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"は受け入れられないようですが、その理由はわかりません。
エミュレータからデータベースファイルを抽出し、制約をスクリプト化して、CASCADEルールが作成されているかどうかを確認します。 – ErikEJ
同様の問題が発生しました。 DataContext.Logにログリスナーを添付した後、ON CASCADE DELETE制約が作成されていないことがわかりました。属性のプロパティの異なる組み合わせを再生した後、私はあきらめた。 Windows Phone用Linq2SQLの場合DeleteRule = "CASCADE"はDB内に制約を作成していません! :/ – rObiwahn