2017-10-22 11 views
2

でSQLに表示されますI以下の2つのテーブルがあります。挿入子がDapperの

public class TestA 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public IEnumerable<TestB> Test { get; set; } 
} 

public class TestB 
{ 
    public int Id { get; set; } 
    public int TestAId { get; set; } 
} 

アイデアは、私は私の種皮オブジェクトから種皮に関連するすべてのTESTBレコードにアクセスすることができますです。私は何を把握しようとしていますと、TESTBはここでテストAに関連する複数の行を持っている場合は特に、試験A及びTESTBの両方にI挿入しない方法です、私が試したものです:私たちはDapperのを与えることができることを知って

var data = new TestA 
{ 
    Name = "ABC", 
    Id = 1, 
    Test = new List<TestB> 
    { 
     new TestB() { Id = 1, TestAId = 1}, 
     new TestB() {Id = 2, TestAId = 1}, 
     new TestB() {Id = 3, TestAId = 1} 
    } 
}; 

var query = "INSERT INTO TestA(Id, Name) VALUES(@Id, @Name) INSERT INTO TestB(Id, TestAId) VALUES(@Test.TestB.Id, @Test.TestB.TestAId)"; 

using (var con = conn) 
{ 
    con.Execute(query, data); 
} 

そのリストを列挙して個々のレコードを挿入するほどスマートですが、そのリストがオブジェクトの子である場合、どのように同じことを達成するのですか?私も自分の値を@Test.Id, @Test.TestAIdにしようとしましたが、全く同じエラーがありました。

型Test.TestBのメンバーは、あなたがこれを試みることができるパラメータ値

答えて

0

として使用することはできません。

var data = new TestA 
{ 
    Name = "ABC", 
    Id = 1, 
    Test = new List<TestB> 
    { 
     new TestB() { Id = 1, TestAId = 1}, 
     new TestB() {Id = 2, TestAId = 1}, 
     new TestB() {Id = 3, TestAId = 1} 
    } 
}; 

var query = "INSERT INTO TestA(Id, Name) VALUES(@Id, @Name) INSERT INTO TestB(Id, TestAId) VALUES(@Test.TestB.Id, @Test.TestB.TestAId)"; 

using (var con = conn) 
{ 
    var query = "INSERT INTO TestA(Id, Name) VALUES(@Id, @Name)"; 
    con.Execute(query, new { Id = data.Id, Name = data.Name }); 


    foreach (var item in data.Test) 
    { 
     string processQuery = "INSERT INTO TestB(Id, TestAId) VALUES (@Id, @TestAId)";   
     connection.Execute(processQuery, item); 
    } 
} 
+1

私は聞かせする方法があるかどうかを把握しようとしていましたDapperはすべてを扱います。それは不可能に思えます。また、ループ処理の代わりに、 'conn.Execute(processQuery、data.Test);を実行するだけで済みます。リストを取得し、挿入クエリを生成して実行するだけで十分です。 – Bojan

関連する問題