【问题标题】:How to add parent-child relations with BLToolkit如何使用 BLToolkit 添加父子关系
【发布时间】:2012-08-07 07:37:54
【问题描述】:

我想使用 BLToolkit 在父/子关系中的一组表中添加一些新记录。不幸的是,我无法弄清楚我错过了什么,因为在提交之后,我的数据库中只有父行。

当我在将父对象添加到父对象列表之前检查父对象时,它包含预期的子对象。我很确定我在 SQLQuery-Bit 中遗漏了一些东西,但我不知道是什么。

这是我设置的内容。

  • 创建表的 sql 代码
    CREATE TABLE [dbo].[PARENTS](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [SOME_VALUE] [int] NOT NULL,
        CONSTRAINT [PK_PARENT] PRIMARY KEY CLUSTERED 
        (
            [ID] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    CREATE TABLE [dbo].[CHILDS](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [PARENT_ID] [int] NOT NULL,
        [SOME_TEXT] [nvarchar](50) NOT NULL,
        CONSTRAINT [PK_CHILD] PRIMARY KEY CLUSTERED 
        (
            [ID] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    ALTER TABLE [dbo].[CHILDS]  WITH CHECK ADD  CONSTRAINT [FK_CHILD_PARENT] FOREIGN KEY([PARENT_ID])
    REFERENCES [dbo].[PARENTS] ([ID])
    GO

    ALTER TABLE [dbo].[CHILDS] CHECK CONSTRAINT [FK_CHILD_PARENT]
[TableName("PARENTS")]
public class Parent
{
    public Parent()
    {
        Children = new List<Child>();
    }

    [MapField("ID"), PrimaryKey, NonUpdatable]
    public int Id;

    [MapField("SOME_VALUE")]
    public int SomeValue;

    [Association(ThisKey = "ID", OtherKey = "PARENT_ID", CanBeNull = false)]
    public List<Child> Children;
}

[TableName("CHILDS")]
public class Child
{
    [MapField("ID"), PrimaryKey, NonUpdatable]
    public int Id;

    [MapField("SOME_TEXT")]
    public string SomeText;

    [Association(ThisKey = "PARENT_ID", OtherKey = "ID", CanBeNull = false)]
    public Parent Parent;
}
  • 插入行的代码
using (DbManager db = new DbManager())
{
    db.BeginTransaction();
    SqlQuery<Parent> query = new SqlQuery<Parent>();

    IList<Parent> parents = new List<Parent>();
    for (int i = 0; i < 10; i++)
    {
        Parent parent = new Parent();
        parent.SomeValue = i;

        Child child = new Child();
        child.SomeText = i.ToString();

        parent.Children.Add(child);
        parents.Add(parent);
    }
    query.Insert(db, 10, parents);
    db.CommitTransaction();
}

【问题讨论】:

    标签: bltoolkit


    【解决方案1】:

    您的代码没有问题。 BLToolkit 是一个轻量级的 ORM,这意味着它不会跟踪对象的状态。这与 EF、L2SQL、NHibernate 等其他 ORM 不同。在 BLToolkit 中,您直接使用数据库。你应该做的是:

    1. 插入 Parent 并获取它的身份。
    2. 然后插入 Child 并将其设置为 parent id。

    此外,当您插入/更新或删除时,请像这样在 try/catch 中进行操作

    using (DbManager db = new DbManager())
    {
        try
        {
            db.BeginTransaction();
    
            // do something here...
    
            db.CommitTransaction();
        }
        catch
        {
            db.RollbackTransaction();
        }
    }
    

    【讨论】:

    • 感谢您解决此问题。另外:在插入父值后,有什么聪明的方法可以立即接收 ID 吗?还是我必须在第二步中触发第二个查询,例如“SELECT @SCOPE_IDENTITY”?
    • 你可以做一个 InsertWithIdentity() 见bltoolkit.net/…
    猜你喜欢
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 2011-05-26
    • 2020-03-03
    • 2022-07-28
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    相关资源
    最近更新 更多