我有Business对象(DEVELOPERS WRITE)和一些SPROCS(DBA WRITE)
任何人都可以推荐一个好的对象映射器来处理这种设置.
我尝试了codemith和nhibernate并遇到了麻烦.我不介意我的ORM是免费的还是付费的.
SubSonic对sprocs有很好的支持.它将每个都包装在一个帮助器方法中,如果需要,您可以从结果中检索强类型集合或实体.我在这篇博客文章中展示了一种方法.只要你的sproc返回与SELECT*FROM TableName相同的模式,它就可以与你的SubSonic实体一起使用.
至于基于数据库生成类,SubSonic会生成部分类,以便您可以根据需要进行扩展.您还可以从SubSonic生成的类到您的实际模型进行映射.
Subsonic有一个灵活的解决方案:
class CustomerOrder { private string productName; public string ProductName { get { return productName; } set { productName = value; } } private int total; public int Total { get { return total; } set { total = value; } } }
然后:
Listorders = Northwind.SPs.CustOrderHist("ALFKI") .ExecuteTypedList ();
亚力士是一款坚固的"瑞士军刀"式ORM.
免责声明:我是Dapper的作者.
如果您正在寻找一个简单的对象映射器来处理映射到业务对象的过程,那么Dapper非常适合.
请记住,它没有"图形管理","身份图"等.它提供了一个完整的解决方案,涵盖了其他ORM所不具备的许多场景.
尽管如此,它提供了最快的对象物化器之一,在某些基准测试中,它比EF快10倍,甚至比亚音速快100倍.
琐碎的:
create proc spGetOrder @Id int as select * from Orders where Id = @Id select * from OrderItems where OrderId = @Id
可以使用以下内容进行映射:
var grid = cnn.QueryMultiple("spGetOrder", new {Id = 1}, commandType: CommandType.StoredProcedure); var order = grid.Read(); order.Items = grid.Read ();
此外,您还支持:
一个多映射器,允许您将单行添加到多个对象
输入/输出/返回参数支持
用于数据库特定参数处理的可扩展接口(如TVP)
例如:
create proc spGetOrderFancy @Id int, @Message nvarchar(100) output as set @Message = N'My message' select * from Orders join Users u on OwnerId = u.Id where Id = @Id select * from OrderItems where OrderId = @Id return @@rowcount
可以映射为:
var p = new DynamicParameters(); p.Add("Id", 1); p.Add("Message",direction: ParameterDirection.Output); p.Add("rval",direction: ParameterDirection.ReturnValue); var grid = cnn.QueryMultiple("spGetOrder", p, commandType: CommandType.StoredProcedure); var order = grid.Read((o,u) => {o.Owner = u; return o;}); order.Items = grid.Read (); var returnVal = p.Get ("rval"); var message = p.Get ("message");
最后,dapper还允许自定义参数实现:
public interface IDynamicParameters { void AddParameters(IDbCommand command); }
实现此接口时,您可以告诉dapper您希望添加到命令中的参数.这允许您支持Table-Valued-Params和其他DB特定功能.