我想通过使用BLToolkit将一些新记录添加到父/子关系中的一组表中。不幸的是,我无法弄清楚我错过了什么,因为在提交之后,我只在我的数据库中拥有父行。
当我在将父对象添加到parents-List之前检查它时,它包含了像期望的Child-Object。我很确定我在SQLQuery-Bit中遗漏了一些东西,但我不知道是什么。
以下是我设置的内容。
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();
}
答案 0 :(得分:2)
您的代码没有任何问题。 BLToolkit是一个轻量级的ORM,这意味着它不会跟踪对象的状态。这与其他ORM不同,如EF,L2SQL,NHibernate。在BLToolkit中,您可以直接使用数据库。你应该做的是:
此外,当您插入/更新或删除时,请在try / catch中执行此操作
using (DbManager db = new DbManager())
{
try
{
db.BeginTransaction();
// do something here...
db.CommitTransaction();
}
catch
{
db.RollbackTransaction();
}
}