Как убрать строку из `detail`.(Мастер подробно)? - PullRequest
1 голос
/ 02 апреля 2019

Когда я удаляю строку из таблицы detail, удаляется только значение внешнего ключа - id_group в таблице хранения (SQL Server), а сама строка остается в таблице.
Я использую:

  • SQL Server;
  • Entity Framework;
  • Девэкспресс;
  • WinForms;
  • gridControl

Я подключился к базе данных с помощью Entity Framework.Создан источник данных.

Перетащите в источник данных таблицы форм:

enter image description here

bindingSource (bs_tbl_01_Groups) GridControlтаблицы Master заполняется методом.

cntDB.tbl_01_Groups.Load();
bs_tbl_01_Groups.DataSource = cntDB.tbl_01_Groups.Local.ToBindingList();

bindingSource (bs_tbl03GroupsStud) GridControl таблицы Detail заполняется автоматически.
Заполнение bindingSource (bs_tbl03GroupsStud) GridControl таблицы Detail.
enter image description here

Я хочу удалить строку в таблице detail.
Я пробую методы:
- gridView2.DeleteSelectedRows ();;
или
- gridView2.DeleteRow (gridView2.FocusedRowHandle);;

Логика:
- Пользователь.Выбирает строку;
- Пользователь.Нажмите кнопку Удалить;
Рабочий код - gridView2.DeleteSelectedRows();
- Строка в базе данных не удалена;
- Пользователь.Нажмите кнопку Save;
Код выполняется - cntDB.SaveChanges ();
- В базе данных в строке удаляется только значение FK;

Результат:
- методы удаляют только значение внешнего ключа id_group в таблице хранения (MS SQL), а сама строка остается в таблице;
- строка удаляется только из gridView (gridControl) (это происходит из-за отсутствия значения внешнего ключа из связанной строки);

enter image description here enter image description here

Вопрос: Как убедиться, что при удалении строки из detail таблица, строка удаляется из таблицы хранения (SQL Server)?

Добавление:
У меня возникла проблема: в GridControl (detail) вместо таблицы отображались столбцы «Количество» и «Только для чтения». Ссылка
Решение: использовал класс ObservableListSource.cs. Ссылка

Код приложения:

 ContextDB cntDB;
private void Form1_Load(object sender, EventArgs e)
{
   cntDB = new ContextDB();

    FillGrid();   
}

public void FillGrid()
{
    cntDB.tbl_01_Groups.Load();
    bs_tbl_01_Groups.DataSource = cntDB.tbl_01_Groups.Local.ToBindingList();            
}

public void RemoveRow_gridView_2()
{
    gridView2.DeleteSelectedRows();
}


public void Save()
{
    cntDB.SaveChanges();
}

Код SQL таблиц Master.

CREATE TABLE [dbo].[tbl_01_Groups] (
  [id_group] int  IDENTITY(1,1) NOT NULL,
  [nameGroup] nvarchar(255) COLLATE Cyrillic_General_CI_AS  NULL,
  [Property_1_Group] nvarchar(255) COLLATE Cyrillic_General_CI_AS  NULL,
  [Property_2_Group] nvarchar(255) COLLATE Cyrillic_General_CI_AS  NULL,
  [Property_3_Group] nvarchar(255) COLLATE Cyrillic_General_CI_AS  NULL,
  CONSTRAINT [PK_tbl_01_Groups] PRIMARY KEY NONCLUSTERED ([id_group])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = OFF)  
ON [PRIMARY]
)  
ON [PRIMARY]
GO

ALTER TABLE [dbo].[tbl_01_Groups] SET (LOCK_ESCALATION = TABLE)

Код SQL для таблиц detail.

CREATE TABLE [dbo].[tbl_03_GroupsStud] (
  [id_groupStud] int  IDENTITY(1,1) NOT NULL,
  [id_group] int  NULL,
  [id_stud] int  NULL,
  [groupStud_descript] nvarchar(255) COLLATE Cyrillic_General_CI_AS  NULL,
  CONSTRAINT [PK_tbl_03_GroupsStud] PRIMARY KEY NONCLUSTERED ([id_groupStud])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = OFF)  
ON [PRIMARY],
  CONSTRAINT [FK_id_grp] FOREIGN KEY ([id_group]) REFERENCES [dbo].[tbl_01_Groups] ([id_group]) ON DELETE NO ACTION ON UPDATE NO ACTION
)  
ON [PRIMARY]
GO

ALTER TABLE [dbo].[tbl_03_GroupsStud] SET (LOCK_ESCALATION = TABLE)

Код entity framework таблицы Master.

public partial class tbl_01_Groups
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public tbl_01_Groups()
        {
            this.tbl_03_GroupsStud = new ObservableListSource<tbl_03_GroupsStud>();
        }

        public int id_group { get; set; }
        public string nameGroup { get; set; }
        public string Property_1_Group { get; set; }
        public string Property_2_Group { get; set; }
        public string Property_3_Group { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ObservableListSource<tbl_03_GroupsStud> tbl_03_GroupsStud { get; set; }
    }

Код entity framework таблицы detail.

public partial class tbl_03_GroupsStud
    {
        public int id_groupStud { get; set; }
        public Nullable<int> id_group { get; set; }
        public Nullable<int> id_stud { get; set; }
        public string groupStud_descript { get; set; }

        public virtual tbl_01_Groups tbl_01_Groups { get; set; }
    }

Update_1
SaveChanges () метод

enter image description here

1 Ответ

0 голосов
/ 02 апреля 2019

Чтобы уточнить, вы хотите, чтобы гарантировать, что при удалении записи в основной таблице все дочерние записи, связанные с ней, также удаляются?Эту проблему легко решить, используя ON DELETE TRIGGER .

CREATE TRIGGER SampleTrigger
    ON [dbo].[tbl_01_Groups]
    FOR DELETE
AS
    DELETE FROM [dbo].[tbl_03_GroupsStud]
    WHERE id_group IN (SELECT deleted.id_group FROM deleted)
GO
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...