我开始使用PetaPOCO和Dapper,他们都有自己的局限性.但恰恰相反,它们比实体框架闪电般快,我倾向于放弃它的局限性.
我的问题是:是否有任何ORM可以让我们具体定义一对多,多对一和多对多的关系?Dapper.Net和PetaPOCO都可以实现破解这些关系的黑客方式,而且当你可能有5-6个连接时它们甚至不能很好地扩展.如果没有一个微型ORM可以让我们处理它,那么我的第二个问题是我应该放弃这些微ORM在定义关系方面不是那么好并为每一种类型创建一个新的POCO实体的事实我将执行的查询包括这些类型的多连接?这可以很好地扩展吗?
我希望我对自己的问题很清楚.如果没有,请告诉我.
我有一个sql语句如下:
SELECT [User].[ID],
[User].[Name],
[User].[Email]
FROM [User]
WHERE Email = 'user@home.com''
Run Code Online (Sandbox Code Playgroud)
它从petaPOCO发出如下错误:
参数'@home'指定但没有传递的参数具有此名称的属性(在'SELECT [User].[ID],[User].[Name],[User].[Email] FROM [User] WHERE Email ='user@home.com'')
错误消息意味着什么?sql语句有什么问题?petaPOCO在sql语句中不接受'@'吗?我需要通过电子邮件地址进行搜索.
我的工作最近开始使用PetaPoco,虽然很棒但我错过了Dapper允许将单个查询中的多个结果网格处理成pocos的功能.
结果我写了我自己的实现PetaPoco- 如下所示 - 但是有没有人自己编写并且小心分享它?
我想可能还有其他人错过了这个功能.
我有一个列表对象,我用它填充使用Petapoco.
类属性和名称正在加工数据库模式.主类是Issue,它与另外两个类相关,名称和属性也与数据库模式匹配:Condition和SeverityLevel.
public class Issue
{
public int Id { get; set; } // Primary key
/* Some properties... */
public DateTime? CreatedOn { get; set; }
public string CreatedBy { get; set; }
public DateTime? ModifiedOn { get; set; }
public string ModifiedBy { get; set; }
/* ... */
// Related source and target conditions
[PetaPoco.Ignore]
public Condition SourceCondition { get; set; }
[PetaPoco.Ignore]
public Condition TargetCondition { get; set; }
// …Run Code Online (Sandbox Code Playgroud) 我有一个包含以下列的表:
ContractorId ......... INT ............. IDENTITY
ContractorName ........ Varchar(50)....... PK
ContractorGrade ...... .... Varchar(3)....... PK
PetaPoco T4模板生成的类如下所示:
[TableName("contractor_master")]
[PrimaryKey("contractorname", autoIncrement=false)]
[ExplicitColumns]
public partial class contractor_master : TubewellRepo.Record<contractor_master>
{
[Column]
public int contractorid
{
get
{
return _contractorid;
}
set
{
_contractorid = value;
MarkColumnModified("contractorid");
}
}
int _contractorid;
[Column]
public string contractorname
{
get
{
return _contractorname;
}
set
{
_contractorname = value;
MarkColumnModified("contractorname");
}
}
string _contractorname;
[Column]
public string contractorgrade
{
get
{
return _contractorgrade;
}
set
{ …Run Code Online (Sandbox Code Playgroud) 有没有办法将以下内容映射到Dictionary<int,int>?它似乎产生了返回结果的行数,但它们没有值......
Sql sql = new Sql()
.Append("SELECT Count(*) as 'Answer Count', QuestionId")
.Append("FROM CF.Answers")
.Append("WHERE SurveyId = @0", surveyId)
.Append("GROUP BY QuestionId");
var result = database.Fetch<Dictionary<int,int>>(sql);
Run Code Online (Sandbox Code Playgroud) 因为我试图使用PetaPoco调用SQL Server 2008 R2存储过程.
我的存储过程接受表值参数.
如何使用表值param调用petapoco中的存储过程?
这是我想要做的:
var db = new PetaPoco.Database("repikaciskaBaza");
DataTable table = new DataTable();
DataColumn id = table.Columns.Add("id", type: typeof(Int32));
for (int i = 0; i < 10;i++ )
{
DataRow row = table.NewRow();
row["id"] = i;
table.Rows.Add(row);
}
var param = new SqlParameter();
param.DbType = DbType.Object;
param.ParameterName = "@art_id";
param.SqlValue = table;
var lista = db.Query<pocoArts>(";exec dbo.test_sporc_param @0", param);
Run Code Online (Sandbox Code Playgroud)
这段代码给了我一个例外:
传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确.
参数3("@ 0"):数据类型0x62(sql_variant)具有类型特定元数据的无效类型.
如果我设置了parametar ty值
param.SqlDbType = SqlDbType.Structured;
Run Code Online (Sandbox Code Playgroud)
然后我得到例外
The table type parameter '@0' must have …Run Code Online (Sandbox Code Playgroud) stored-procedures table-valued-parameters sql-server-2008-r2 c#-4.0 petapoco
我们使用PetaPoco作为SQL 2008数据库的数据访问工具.尝试在附加了触发器的表上插入/更新行时出现问题.
我们正在使用PetaPoco的db.Save(对象);
显示的错误是:如果语句包含没有INTO子句的OUTPUT子句,则DML语句的目标表'the_table_with_a_trigger'不能具有任何已启用的触发器.
我们如何使用PetaPoco在具有触发器的表上插入/更新数据?
我在我目前的项目中使用PetaPoco作为微型ORM,我必须说我喜欢它.然而,我发现自己在使用PetaPoco.Database的简单场景 - 单元测试服务中苦苦挣扎
public class MyService : IMyService
{
private readonly PetaPoco.Database _database;
public MyService(PetaPoco.Database database)
{
_database = database;
}
public void SaveSomething(MyObject myObject)
{
//...custom logic
_database.Save(myObject);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用IoC(Castle.Windsor)在任何需要的地方注入IMyService和PetaPoco.Database.
现在,当我尝试对我的服务进行单元测试时,我无法正确模拟存根PetaPoco.Database以验证是否正确调用了Save方法.我正在使用NUnit和Rhino.Mocks进行单元测试和模拟.
[TestFixture]
public class MyServiceTests
{
private PetaPoco.Database _database;
[SetUp]
public void SetUp()
{
_database = MockRepository.GenerateMock<Database>("");
}
[Test]
public void ShouldProperlySaveSomething()
{
//Arrange
var myObject = new …Run Code Online (Sandbox Code Playgroud) 使用PetaPoco,您可以进行事务管理,执行以下操作:
var newObject = new NewObject();
var newObjectId = 1;
using (var scope = db.GetTransaction())
{
newObject = db.SingleOrDefault<NewObject>("SELECT * FROM tblNewObject WHERE Id = @0", newObjectId);
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
虽然这对于管理事务更新时的管理非常有用,但是对于控制事务的隔离级别来说,它有点缺乏类似于使用传统SQL连接的方式:
TransactionOptions transOptions = new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted };
using (new TransactionScope(TransactionScopeOption.Required, transOptions))
{
//here be transactions
}
Run Code Online (Sandbox Code Playgroud)
在PetaPoco中,GetTransaction返回一个新的Transaction,使用该特定的构造函数调用BeginTransaction.在这种情况下,BeginTransaction使用.NET的IDbConnection.BeginTransaction() - 它具有提供事务隔离级别的重载.据我所知,PetaPoco没有提供任何方法来为该方法提供隔离级别.有谁知道是否有可能实际修改PetaPoco的隔离级别而不必深入挖掘源并添加一个需要隔离级别的重载构造函数?我很高兴这样做并提交拉取请求,但我想确保在我完成工作之前,我不会错过任何简单明了的事情.
petapoco ×10
c# ×5
.net ×2
dapper ×2
c#-4.0 ×1
join ×1
mapping ×1
massive ×1
micro-orm ×1
mocking ×1
orm ×1
rhino-mocks ×1
sql-server ×1
transactions ×1
unit-testing ×1