次のようなビジネス オブジェクトがあるとします。
public class MyBase
{
public int Id { get; set; }
}
public class Parent : MyBase
{
public List<Child> Children { get; set; }
// Additional objects with 1:1 relationship
}
public class Child : MyBase
{
public Parent Parent { get; set; }
public List<Grandchild> Grandchildren { get; set; }
// Some other properties
}
public class GrandChild : MyBase
{
public Child { get; set; }
// Some other properties including a timestamp
}
このシナリオでは EF のパフォーマンスが低いため、元々 Entity Framework で記述された一括挿入機能を ADO.Net およびストアド プロシージャに置き換えようとしています。
DBの専門家ではないので、最初に自分自身を方向付けました
http://www.sommarskog.se/arrays-in-sql-2008.html
Child
そのガイダンスを使用して、と一緒にを挿入する (EF と比較して) パフォーマンスの良いストアド プロシージャを作成することができましたList<GrandChild>
。
CREATE TYPE tvpInt32List AS TABLE (n int NOT NULL)
CREATE PROCEDURE uspInsertChild @parentId INT, @fk1Id INT, @fk2Id INT,
@listValues tvpInt32List READONLY
AS
DECLARE @id INT
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.Children VALUES(@fk2Id, @fk1Id, NULL, 0, 1, NULL, NULL, NULL, NULL, NULL, @fk1Id, @parentId)
SET @Id = SCOPE_IDENTITY()
INSERT INTO dbo.Grandchildren SELECT n, '', GETDATE(), @id FROM @listValues
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
Parent
ただし、これをさらに一歩進めて、オブジェクトのデータを受け取り、関連するList<Child>
とList<GrandChild>
for eachを作成するストアド プロシージャを作成したいと思いますChild
。
ストアドプロシージャでそれにアプローチする方法について、私は概念的に途方に暮れています。
そのタイプのデータ構造を渡してストアド プロシージャで処理するには、どのような戦略を使用できますか?