Я пытаюсь настроить отношения FK между двумя столбцами, которые будут удалять всех дочерних элементов в БД при удалении родительской строки.Мои определения выглядят так:
[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;
}
}
}
}
Из того, что я могу сказать, кажется, что реализация FK, кажется, работает.Добавление родительской строки в БД автоматически добавит дочерние строки;Выбор родительской строки правильно заполняет свойство Children всеми связанными дочерними элементами.
Я также хотел бы иметь возможность удалить родительскую строку в базе данных, и это удаление также удалит все связанные дочерние элементы.При такой настройке при удалении родителя появляется сообщение об ошибке «Невозможно удалить значение первичного ключа, поскольку ссылки на этот ключ все еще существуют. [Имя ограничения внешнего ключа = FK_Child_Parent]».
Появляется DeleteRule =«Каскад» не удостоен чести, но я не уверен, почему.