插入带有Dapper错误的IEnumerable 集合,“Dapper不支持类”。

是的, 这里和这里有关于如何使用dapper-dot-net插入记录的问题 。 然而,答案虽然提供了丰富的信息,但似乎并未将我指向正确的方向。 以下是这种情况:将数据从SqlServer移动到MySql。 将记录读入IEnumerable很容易,但我只是没有在插入上获取内容。 首先,’移动记录代码’:

 // moving data Dim session As New Session(DataProvider.MSSql, "server", _ "database") Dim resources As List(Of WTUser) = session.QueryReader(Of WTUser)("select * from tbl_resource") session = New Session(DataProvider.MySql, "server", "database", _ "user", "p@$$w0rd") // *edit* - corrected parameter notation with '@' Dim strInsert = "INSERT INTO tbl_resource (ResourceName, ResourceRate, ResourceTypeID, ActiveYN) " & _ "VALUES (@ResourceName, @ResourceRate, @ResourceType, @ActiveYN)" Dim recordCount = session.WriteData(Of WTUser)(strInsert, resources) // session Methods Public Function QueryReader(Of TEntity As {Class, New})(ByVal Command As String) _ As IEnumerable(Of TEntity) Dim list As IEnumerable(Of TEntity) Dim cnn As IDbConnection = dataAgent.NewConnection list = cnn.Query(Of TEntity)(Command, Nothing, Nothing, True, 0, CommandType.Text).ToList() Return list End Function Public Function WriteData(Of TEntity As {Class, New})(ByVal Command As String, ByVal Entities As IEnumerable(Of TEntity)) _ As Integer Dim cnn As IDbConnection = dataAgent.NewConnection // *edit* if I do this I get the correct properties, but no data inserted //Return cnn.Execute(Command, New TEntity(), Nothing, 15, CommandType.Text) // original Return statement Return cnn.Execute(Command, Entities, Nothing, 15, CommandType.Text) End Function 

cnn.Query和cnn.Execute调用dapper扩展方法。 现在,WTUser类(注意:列名在SqlServer中从’WindowsName’更改为MySql中的’ResourceName’,因此两个属性指向同一个字段):

 Public Class WTUser // edited for brevity - assume the following all have public get/set methods Public ActiveYN As String Public ResourceID As Integer Public ResourceRate As Integer Public ResourceType As Integer Public WindowsName As String Public ResourceName As String End Class 

我从dapper收到一个例外:“Dapper不支持WTUser。” DataMapper(dapper)中的这个方法:

  private static Action CreateParamInfoGenerator(Type OwnerType) { string dmName = string.Format("ParamInfo{0}", Guid.NewGuid()); Type[] objTypes = new[] { typeof(IDbCommand), typeof(object) }; var dm = new DynamicMethod(dmName, null, objTypes, OwnerType, true); // < p.Name)) 

此时OwnerType =

System.Collections.Generic.List`1 [[CRMBackEnd.WTUser,CRMBE,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]],mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089

似乎OwnerType应该是CRMBackEnd.WTUser …不是List …… ??? 因为正在发生的事情是集合属性正在被迭代:Count,Capacity等。我缺少什么?

更新

如果我将session.WriteData修改为:

 Public Function WriteData(Of TEntity As {Class, New})(ByVal Command As String, _ ByVal Entities As IEnumerable(Of TEntity)) _ As Integer Dim cnn As IDbConnection = dataAgent.NewConnection Dim records As Integer For Each entity As TEntity In Entities records += cnn.Execute(Command, entity, Nothing, 15, CommandType.Text) Next Return records End Function 

记录被很好地插入…但我不认为这是必要的,例如:

 connection.Execute(@"insert MyTable(colA, colB) values (@a, @b)", new[] { new { a=1, b=1 }, new { a=2, b=2 }, new { a=3, b=3 } } ).IsEqualTo(3); // 3 rows inserted: "1,1", "2,2" and "3,3" 

……来自dapper-dot-net

我刚刚为此添加了一个测试:

 class Student { public string Name {get; set;} public int Age { get; set; } } public void TestExecuteMultipleCommandStrongType() { connection.Execute("create table #t(Name nvarchar(max), Age int)"); int tally = connection.Execute(@"insert #t (Name,Age) values(@Name, @Age)", new List { new Student{Age = 1, Name = "sam"}, new Student{Age = 2, Name = "bob"} }); int sum = connection.Query("select sum(Age) from #t drop table #t").First(); tally.IsEqualTo(2); sum.IsEqualTo(3); } 

它像宣传的那样工作。 我对multi-exec的工作方式做了一些修改(所以它的速度更快,支持object [])。

我的猜测是你有问题,因为你在WTUser所有领域都缺少一个getter属性。 所有参数都必须具有阅读器属性,我们不支持从字段中提取它,它需要复杂的解析步骤才能保持高效。


导致问题的另一个问题是将dapper传递给不支持映射的param。

例如,以下类不支持作为参数:

 class Test { public int Id { get; set; } public User User {get; set;} } cnn.Query("select * from Tests where Id = @Id", new Test{Id = 1}); // used to go boom 

问题是dapper没有解析SQL,它假设所有的道具都可以设置为params但是无法解析User的SQL类型。

最新转速解决了这个问题