有人可以解释一下Dapper.Rainbow和Dapper.Contrib之间的区别吗?
我的意思是你什么时候使用Dapper.Contrib的SqlMapperExtensions.cs,你什么时候应该使用Dapper.Rainbow?
如何使用dapper/dapper extensions/dapper rainbow或any忽略模型上的属性
那些精致的图书馆?
我已经成功地将今天的东西作为小沙箱/ POC项目运行起来,但似乎在一个问题上让我头疼...
题:
有没有办法让dapper映射到带有空格的SQL列名.
作为我的结果集,我有一些这样的效果.
例如:
SELECT 001 AS [Col 1],
901 AS [Col 2],
00454345345345435349 AS [Col 3],
03453453453454353458 AS [Col 4]
FROM [Some Schema].[Some Table]
Run Code Online (Sandbox Code Playgroud)
我的班级看起来像这样
public class ClassA
{
public string Col1 { get; set; }
public string Col2 { get; set; }
///... etc
}
Run Code Online (Sandbox Code Playgroud)
我的实现目前看起来像这样
public Tuple<IList<TClass>, IList<TClass2>> QueryMultiple<TClass, TClass2>(object parameters)
{
List<TClass> output1;
List<TClass2> output2;
using (var data = this.Connection.QueryMultiple(this.GlobalParameter.RpcProcedureName, parameters, CommandType.StoredProcedure))
{
output1 = data.Read<TClass>().ToList();
output2 = data.Read<TClass2>().ToList();
}
var result = new …Run Code Online (Sandbox Code Playgroud) 我刚开始研究Dapper.我正在测试它并能够做基本的CRUD,我的基本意思是在这个结构的类上工作:
public class Product {
public int Id {get;set;}
public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找能够更容易地进行插入和更新的东西,并找到了Dapper.Rainbow.我检查了它,并能够使用它来获取和插入对象,如上所述.我的问题是,当Product有导航属性时,我不能在该字段上插入.所以,如果我有这个:
public class Product {
public int Id {get;set;}
public string Name {get;set;}
public ProductCategory Category {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我将无法做到这一点:
// connection is a valid and opened connection
var db = TestDatabase.Init(connection , 300);
var newId = db.Products.Insert(newProduct);
Run Code Online (Sandbox Code Playgroud)
因为这个原因:
The member Category of type ProductCategory cannot be used as a parameter value
Run Code Online (Sandbox Code Playgroud)
如果我Category用type 替换int(数据库中的相同数据类型),则可以解决该问题.但是,如果我这样做,我将无法使用其类别信息查询产品,而不仅仅是(类别)ID.
因此,如果不使用原始Dapper,如何使用具有导航属性的类进行插入和更新?我希望我可以执行以下操作并告诉Dapper.Rainbow Category在插入或更新时忽略.
public class Product { …Run Code Online (Sandbox Code Playgroud) 我在SQLite上创建了一个示例表,它有一个自动递增的Id列.
CREATE TABLE "ESVLIntegration" ("Id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , "ProcessId" TEXT NOT NULL , "UserId" INTEGER NOT NULL , "Status" TEXT NOT NULL , "StartDate" DATETIME NOT NULL , "EndDate" DATETIME, "Operation" TEXT NOT NULL , "SNEquip" TEXT NOT NULL , "CardName" TEXT NOT NULL , "FilePath" TEXT NOT NULL , "Processed" BOOL NOT NULL )
Run Code Online (Sandbox Code Playgroud)
但是当我第二次尝试插入时,我收到以下错误:
由于约束违规而中止PRIMARY KEY必须是唯一的
这是我的代码
public class ESVLIntegration
{
public long Id { get; set; }
public String ProcessId { get; …Run Code Online (Sandbox Code Playgroud) 我对 Dapper Rainbow 还很陌生,所以我可能会遗漏一些明显的东西。是否可以指定表名,如果可以,如何指定?
我尝试了以下但没有运气。
public class DashboardContext : Database<DashboardContext>
{
public DashboardContext()
{
this.DashboardResults = new Table<DashboardResult>(this, "Monitor.DashboardResult");
}
public Table<DashboardResult> DashboardResults { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试Dapper.我喜欢到目前为止所看到的.为了做简单的CRUD,我使用Dapper.rainbow.它工作得很好.但是,仅当表具有名称为Id的标识列时,它才有效.有这样的db是有意义的,但我不能要求在数据库中更改列名只是为了使用Dapper.为了更清楚,我正在使用像Northwind Db这样的数据库.它在Id列中重复了表名.
为了处理这个问题,我更改了Dapper.Rainbow代码如下:
public T Get(TId id,string idColumnName="Id")
{
return database.Query<T>("select * from " + TableName + " where "+idColumnName+" = @id", new { id }).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个如列映射/注释或完全不同的东西?
我读过这样的问题
Dapper.Rainbow VS Dapper.Contrib
(我遇到了与Dapper.Contrib类似的小问题,我会另外问一下).
更新 - 不确定答案是否适用于我的Dapper.Rainbow问题(至少,我不知道如何).
提前感谢您的帮助!
为什么我会得到这个例外?代码不一样,但接近'demo'https://gist.github.com/1599013
例外:MissingMethodException
说明:
找不到方法:'System.Collections.Generic.IEnumerable
1<System.Object> Dapper.SqlMapper.Query(System.Data.IDbConnection, System.String, System.Object, System.Data.IDbTransaction, Boolean, System.Nullable1,System.Nullable`1)'.
码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using Dapper;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;
namespace daconsole2
{
class Program
{
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime? LastPurchase { get; set; }
}
// container with all the tables
class MyDatabase : Database<MyDatabase>
{
public …Run Code Online (Sandbox Code Playgroud)