Java中与Dapper,PetaPoco,Massive或CodingHorror等微型ORM最接近的等价物是什么?
我已经开始使用https://github.com/robconery/massive进行项目,我想知道是否有任何映射工具允许支持动态到静态类型映射?
我之前使用过AutoMapper,AutoMapper是否支持此功能?
我知道AutoMapper中的DynamicMap函数,但我相信这个函数用于运行地图而不先创建Map.在我下面的例子中,它不起作用.
dynamic curUser = users.GetSingleUser(UserID);
var retUser = Mapper.DynamicMap<UserModel>(curUser);
users.GetSingleUser(UserID); // returns a dynamic object
Run Code Online (Sandbox Code Playgroud) 我已经开始研究需要来自庞大的现有数据库的数据的MVC 3项目.
我的第一个想法是继续使用EF 4.1并创建一堆POCO来表示我需要的表,但我开始认为映射会变得过于复杂,因为我只需要一些表中的一些列.(感谢Steven在评论中的澄清.
所以我想我会试试Massive ORM.我通常使用工作单元实现,所以我可以保持一切很好的解耦,并可以使用依赖注入.这是我对Massive的一部分:
public interface ISession
{
DynamicModel CreateTable<T>() where T : DynamicModel, new();
dynamic Single<T>(string where, params object[] args)
where T : DynamicModel, new();
dynamic Single<T>(object key, string columns = "*")
where T : DynamicModel, new();
// Some more methods supported by Massive here
}
Run Code Online (Sandbox Code Playgroud)
这是我对上述界面的实现:
public class MassiveSession : ISession
{
public DynamicModel CreateTable<T>() where T : DynamicModel, new()
{
return new T();
}
public dynamic Single<T>(string where, params object[] …Run Code Online (Sandbox Code Playgroud) 我开始使用PetaPOCO和Dapper,他们都有自己的局限性.但恰恰相反,它们比实体框架闪电般快,我倾向于放弃它的局限性.
我的问题是:是否有任何ORM可以让我们具体定义一对多,多对一和多对多的关系?Dapper.Net和PetaPOCO都可以实现破解这些关系的黑客方式,而且当你可能有5-6个连接时它们甚至不能很好地扩展.如果没有一个微型ORM可以让我们处理它,那么我的第二个问题是我应该放弃这些微ORM在定义关系方面不是那么好并为每一种类型创建一个新的POCO实体的事实我将执行的查询包括这些类型的多连接?这可以很好地扩展吗?
我希望我对自己的问题很清楚.如果没有,请告诉我.
Rob对Massive ORM的另一篇精彩文章.我无法找到的是有关如何访问存储过程的参考. SubSonic在使用ActiveRecords时遇到了一些问题,所以我更喜欢使用存储过程进行数据访问,仍然使用SubSonic ORM.
我还没有看到的是对ORM中的SQL Server TVP的直接支持,所以我 修改了SubSonic(无耻插件)来支持它们.
是否可以使用Massive访问SQL Server sprocs.其次,是否有TVP支持?
stored-procedures sql-server-2008 table-valued-parameters subsonic2.2 massive
在这个页面上,Scott Hanselman展示了两个来自Micro-ORMs Dapper和Massive的例子,Massive-example引起了我的兴趣,因为我看不出他们如何实现这种语法.
示例如下,我将在几行而不是一行中断它:
var tbl = new Products();
var products = tbl.All(where: "CategoryID = @0 AND UnitPrice > @1",
orderBy: "ProductName", limit: 20, args: 5,20);
^----+---^
|
+-- this
Run Code Online (Sandbox Code Playgroud)
他们是如何实现这种语法的,允许args有多个值?我假设params基于参数,因为这是允许的唯一的事情,但我不明白他们是如何构建允许的方法,因为在我看来我尝试的所有内容最终都抱怨命名参数并修复位置参数的顺序错误.
我尝试了这样的测试方法:
public static void Test(string name, int age, params object[] args)
{
}
Run Code Online (Sandbox Code Playgroud)
然后使用命名参数:
Test(age: 40, name: "Lasse", args: 10, 25);
Run Code Online (Sandbox Code Playgroud)
但我得到的只是:
在指定了所有固定参数后,必须出现命名参数规范
所以很明显这是错误的.此外,我无法在源头看到任何允许这样做但也许我在错误的地方看.
我在这里错过了什么?
我喜欢Rails,所以我被Rob Conery的Massive ORM所吸引......好吧,非常棒.
我的问题是你究竟能和你应该如何使用Massive进行验证?在Rails中,您可以使用简单的"validates"关键字来进行内联验证和/或引用一个方法来调用...以及定义何时进行此类验证的能力(例如,仅用于创建,保存后等). ).
是否有这样的Rails激发了Massive的验证?如果是这样,推荐的方法是什么?
非常感谢-wg
我正在使用Rob Conery的Massive进行数据库访问.我想围绕几个插入包装事务,但第二个插入使用从第一个插入返回的标识.对我来说,在交易中如何做到这一点并不明显.一些援助将不胜感激.
var commandList = new List<DbCommand>
{
contactTbl.CreateInsertCommand(new
{
newContact.Name,
newContact.Contact,
newContact.Phone,
newContact.ForceChargeThreshold,
newContact.MeterReadingMethodId,
LastModifiedBy = userId,
LastModifiedDate = modifiedDate,
}),
branchContactTbl.CreateInsertCommand(new
{
newContact.BranchId,
ContactId = ????, <-- how to set Id as identity from previous command
}),
};
Run Code Online (Sandbox Code Playgroud) 我想将Massive与MySql 一起使用,我发现有大量的SQL(默认),PostgreSQL,Oracle和Sqllite提供程序.是否有MySql的提供程序或其他提供程序之一是否适用于MySql?
我觉得我在这里遇到了几个不好的解决方案,需要一些关于如何最大限度地减少未来痛苦的建议.我们正在使用Massive ORM,它的构造函数中包含以下行:
var _providerName = "System.Data.SqlClient";
if (ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName != null)
_providerName = ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName;
_factory = DbProviderFactories.GetFactory(_providerName);
ConnectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
Run Code Online (Sandbox Code Playgroud)
对我来说,重要的部分是它从中读取连接字符串ConfigurationManager.我们正在尝试集中配置,在这样做时,我们希望将连接字符串保留在我们的web/app.configs之外(我们有大约150个已部署的主机,因此开销变得很大).但是,由于配置文件读取在这里是硬编码的,因此这个ConnectionStrings集合是只读的(有解决方法,但它们都非常脏).
一种可能的方法是将这些行提取到虚方法中,然后使用继承更改它.当我们想要更新Massive时,这并不是那么好,并且从构造函数调用虚方法也可能很糟糕.
我还有其他什么选择?这里的主要优先事项是最小化更新时的影响.
massive ×10
c# ×7
orm ×4
dapper ×2
petapoco ×2
asp.net ×1
asp.net-mvc ×1
automapper ×1
c#-4.0 ×1
dynamic ×1
java ×1
sql ×1
subsonic ×1
subsonic2.2 ×1