我正在使用:ASP.NET MVC,MySql,Dapper.NET micro-orm 我用3个SELECT创建了一个存储过程,其中两个返回列表,第三个返回一个整数。
这是我的代码:
using (var conn = new MySqlConnection(GetConnectionString()))
{
var readDb = conn.QueryMultiple(storedProcedure, parameters, commandType: CommandType.StoredProcedure);
var result = new someView
{
TopicsList = readDb.Read<ITopic>().ToList(),
TopTopicsList = readDb.Read<IMessage>().ToList(),
TopicsCount = readDb.Read<int>().Single()
};
return result;
}
在ITopic中我有TopicId,在IMessage中我有MessageId。
这是错误:
When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id Parameter name: splitOn
我尝试在QueryMultiple和Read上添加splitOn,并且更接近它。
虽然我不明白为什么我需要splitOn?不能看到我有三个单独的SELECT?当在每个选择上分别使用conn.Read(storedProcedure,parameters)时(而不是在所有的一起使用MultipleQuery),dapper将它映射到给定对象没有问题。
我做错了什么?
答案 0 :(得分:2)
1)当我使用真实模型名称而不是它们的接口名称时问题解决了:
TopicView而不是ITopic,TopTopicsView而不是IMessage;
2)一旦修复并且不再出现“没有splitOn”错误,则启动另一个问题&lt; int&gt;在线投射:
TopicsCount = readDb.Read<int>().Single()
可能mysql不会将数字作为整数返回?
我尝试使用小数,对象,动态等等。没有运气。最后通过创建另一个带有int属性的Model来修复它,该属性与database int参数同名,现在它可以工作。
3)这是最终的工作代码:
using (var conn = new MySqlConnection(GetConnectionString()))
{
var parameters = context.MapEntity(query);
var multi = conn.QueryMultiple(storedProcedure, parameters, commandType: System.Data.CommandType.StoredProcedure);
var TopicsList = multi.Read<TopicView>().ToList();
var TopTopicsList = multi.Read<TopTopicsView>().ToList();
var result = multi.Read<HomeView>().Single();
result.TopicsList = TopicsList;
result.TopTopicsList = TopTopicsList;
return result;
}