Mango SQL CE: DeleteRule = "Каскад" не работает - PullRequest
3 голосов
/ 16 марта 2012

Я пытаюсь настроить отношения 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 =«Каскад» не удостоен чести, но я не уверен, почему.

1 Ответ

1 голос
/ 28 февраля 2014

Я знаю, что уже очень поздно, но у меня была та же проблема, и это был первый пост, который я нашел. Все, что я хочу сказать, это то, что все работает.

Вы, вероятно, не должны использовать заглавные буквы в имени правила. И установите 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; }
    }

Надеюсь, это кому-нибудь поможет.

...