【问题标题】:How to remove a line from `detail`. (Master detail)?如何从“详细信息”中删除一行。 (大师详细)?
【发布时间】:2019-08-23 15:30:55
【问题描述】:

当我从detail 表中删除一行时,只删除了存储表(SQL Server)中的外键值-id_group,而行本身仍保留在表中。
我用:

  • SQL 服务器;
  • 实体框架;
  • 开发快递;
  • WinForms;
  • 网格控制

我使用实体框架连接到数据库。 创建了一个数据源。

拖到表格数据源上:

bindingSource (bs_tbl_01_Groups) Master 表的 GridControl 填充了一个方法。

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

bindingSource (bs_tbl03GroupsStud) Detail 表的 GridControl 会自动填充。
填充Detail 表的bindingSource (bs_tbl03GroupsStud) GridControl。

我想删除detail 表中的一行。
我尝试了以下方法:
- gridView2.DeleteSelectedRows ();;

- gridView2.DeleteRow (gridView2.FocusedRowHandle);;

逻辑:
- 用户。选择一个字符串;
- 用户。按删除按钮;
运行代码 - gridView2.DeleteSelectedRows();
- 数据库中的行没有被删除;
- 用户。按Save按钮;
代码被执行——cntDB.SaveChanges ();
- 在数据库中,仅删除行中的值FK

结果:
- 方法只删除存储表(MS SQL)中外键id_group的值,字符串本身保留在表中;
- 该行仅从gridView (gridControl) 中删除(这是因为链接行中没有外键值);

问题:如何保证在删除detail表中的一行时,该行从存储表中删除(SQL Server)?

功能:
我遇到了一个问题: 在 GridControl (detail) 而不是表格中,列“计数”和“只读” “被显示。 Link
解决方案: 使用了 ObservableListSource.cs 类。 Link

应用代码:

 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();
}

Master 表的 SQL 代码。

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)

detail 表的 SQL 代码。

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)

Master 表的entity framework 代码。

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; }
    }

detail 表的entity framework 代码。

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 () 方法

【问题讨论】:

  • 您是否使用探查器检查过什么命令发送到数据库?听起来好像没有发送删除命令,而是仅清除 fk 字段的更新
  • gridView2.DeleteRow 删除了我的 devexpress 网格视图中的整行。问题在于您的代码应该删除数据库中的行。此代码不会删除它,而是仅删除 FK。你能展示处理删除的代码吗?
  • @GuidoG 更新问题
  • cntDB.SaveChanges(); 是做什么的?
  • @GuidoG 1. 保护变化。我不太了解,但可能它只会保存“更改”。如果该行被删除,它不会保存更改或保存,正如我在上面的问题中描述的那样。 2. 链接到手册 - link

标签: c# sql-server winforms entity-framework devexpress


【解决方案1】:

为了澄清,您想要一种方法来确保当主表中的记录被删除时,链接到它的所有子记录也被删除?这可以使用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

【讨论】:

  • 不是。在 GridControl (detail) 中,会显示表格的“详细信息”(tbl_03_GroupsStud)。我希望在删除 GridControl 中的一行时删除 SQL 服务器的detail (tbl_03_GroupsStud) 表中的行。如果我理解正确,您提出一个解决方案:删除GridControl(master)中的一行后,删除GridControl(detail)中的所有相关行,以及存储表中的所有行(detail)SQL服务器如果我不能解释,请询问更多
  • 这不是他的问题。他的问题是,当他从 GroupStud 表中删除一行时,该行并没有从数据库中删除。只有 FK 更新为 NULL
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 2017-02-18
  • 1970-01-01
  • 2014-08-02
  • 2018-06-27
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多