2012-08-07 57 views
0

我想通过使用BLToolkit将一些新记录添加到父/子关系中的一组表中。不幸的是,我不知道我失去了什么,因为提交后,我只有我的数据库中的父行。如何使用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(); 
} 

回答

2

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

  1. 插入父母并得到它的身份。
  2. 然后插入子项并将其设置为父项ID。

此外,当你插入/更新或删除做到这一点的try/catch这样

using (DbManager db = new DbManager()) 
{ 
    try 
    { 
     db.BeginTransaction(); 

     // do something here... 

     db.CommitTransaction(); 
    } 
    catch 
    { 
     db.RollbackTransaction(); 
    } 
} 
+0

内部感谢您清除此了。作为补充:在插入父值后,是否有任何聪明的方式来接收ID?或者我将不得不在第二步中触发第二个查询,如“SELECT @SCOPE_IDENTITY”? – BigBlackDog 2012-08-08 07:51:36

+0

你可以做一个InsertWithIdentity()参见http://www.bltoolkit.net/Doc.LinqExtensions.ashx?HL=insertwithidentity#InsertWithIdentity_1 – 2012-08-08 11:10:31