繁体   English   中英

如何从`detail`中删除一行。 (主要细节)?

[英]How to remove a line from `detail`. (Master detail)?

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

  • SQL Server;
  • 实体框架;
  • devexpress;
  • WinForms;
  • gridControl

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

拖到表单表数据源上:

在此处输入图片说明

bindingSourcebs_tbl_01_Groups )使用一种方法填充Master表的GridControl。

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

bindingSourcebs_tbl03GroupsStud )将自动填充Detail表的GridControl。
填充Detail表的bindingSourcebs_tbl03GroupsStud )GridControl。
在此处输入图片说明

我想在删除行detail表。
我尝试一下方法:
gridView2.DeleteSelectedRows (); ;
要么
gridView2.DeleteRow (gridView2.FocusedRowHandle); ;

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

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

在此处输入图片说明 在此处输入图片说明

问:如何确保从删除一行时, 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();
}

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)

对于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)

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

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

更新_1
SaveChanges ()方法

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM